PCEtLQogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgoKIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KCiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KCiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCgogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKIHF1ZXN0aW9ucy4KLS0+CjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWwgY2xhc3M9IiByZWdlbmFibGVkICBnZWNrbyByYWRpdXMganNlbmFibGVkIHJlZ2xvYWRlZCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPkphdmEgU2NyaXB0aW5nIFByb2dyYW1tZXIncyBHdWlkZTwvdGl0bGU+Cgo8IS0tID09PT09PT09PT09PSAtLT4KPCEtLSBNQUlOIENPTlRFTlQgLS0+CjwhLS0gPT09PT09PT09PT09IC0tPgo8dGFibGUgc3VtbWFyeT0ibGF5b3V0IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPHRib2R5Pjx0cj4KPHRkPgoKPGRpdiBpZD0ic2hhcmVwYWdlIiBjbGFzcz0ic21hbGxwYWdldGl0bGUiPjxoMT5KYXZhIFNjcmlwdGluZyBQcm9ncmFtbWVyJ3MgR3VpZGU8L2gxPjxkaXYgY2xhc3M9InNoYXJlcGFnZSI+CQk8ZGl2IGNsYXNzPSJzaGFyZXBhZ2V3MSBzaGFyZS1tYWlsdG8iPgkJPHRhYmxlIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dGJvZHk+PHRyPgkJPHRkIGlkPSJzaGFyZS1tYWlsdG8iPjxhIGhyZWY9Im1haWx0bzo/c3ViamVjdD1KYXZhJTIwRG9jdW1lbnRhdGlvbiUyMFBhZ2U6JTIwSmF2YSUyMFNjcmlwdGluZyUyMFByb2dyYW1tZXIlMjdzJTIwR3VpZGUmYW1wO2JvZHk9Q2hlY2slMjBvdXQlMjB0aGlzJTIwcGFnZTolMjAlMEElMEFodHRwJTNBJTJGJTJGZG9jcy5vcmFjbGUuY29tJTJGamF2YXNlJTJGNiUyRmRvY3MlMkZ0ZWNobm90ZXMlMkZndWlkZXMlMkZzY3JpcHRpbmclMkZwcm9ncmFtbWVyX2d1aWRlJTJGaW5kZXguaHRtbCIgY2xhc3M9InNoYXJlbGluayBtYWlsdG8iIHRpdGxlPSJFbWFpbCB0aGlzIHBhZ2UgdG8gYSBmcmllbmQiPjwvYT48L3RkPgkJPHRkIGlkPSJzaGFyZS10ZWNobm9yYXRpIj48YSBocmVmPSJodHRwOi8vdGVjaG5vcmF0aS5jb20vc2VhcmNoL2h0dHAlM0ElMkYlMkZkb2NzLm9yYWNsZS5jb20lMkZqYXZhc2UlMkY2JTJGZG9jcyUyRnRlY2hub3RlcyUyRmd1aWRlcyUyRnNjcmlwdGluZyUyRnByb2dyYW1tZXJfZ3VpZGUlMkZpbmRleC5odG1sIiBjbGFzcz0ic2hhcmVsaW5rIHRlY2hub3JhdGkiIHRpdGxlPSJTZWUgd2hvIGxpbmtzIHRvIHRoaXMgcGFnZSBvbiBUZWNobm9yYXRpIj48L2E+PC90ZD4JCTx0ZCBpZD0ic2hhcmUtZGVsaWNpb3VzIj48YSBocmVmPSJodHRwOi8vZGVsLmljaW8udXMvcG9zdD92PTQ7dXJsPWh0dHAlM0ElMkYlMkZkb2NzLm9yYWNsZS5jb20lMkZqYXZhc2UlMkY2JTJGZG9jcyUyRnRlY2hub3RlcyUyRmd1aWRlcyUyRnNjcmlwdGluZyUyRnByb2dyYW1tZXJfZ3VpZGUlMkZpbmRleC5odG1sO3RpdGxlPUphdmElMjBTY3JpcHRpbmclMjBQcm9ncmFtbWVyJTI3cyUyMEd1aWRlIiBjbGFzcz0ic2hhcmVsaW5rIGRlbGljaW91cyIgdGl0bGU9IkJvb2ttYXJrIHRoaXMgcGFnZSBpbiBkZWwuaWNpby51cyI+PC9hPjwvdGQ+CQk8dGQgaWQ9InNoYXJlLWRpZ2ciPjxhIGhyZWY9Imh0dHA6Ly9kaWdnLmNvbS9zdWJtaXQ/cGhhc2U9MiZhbXA7dXJsPWh0dHAlM0ElMkYlMkZkb2NzLm9yYWNsZS5jb20lMkZqYXZhc2UlMkY2JTJGZG9jcyUyRnRlY2hub3RlcyUyRmd1aWRlcyUyRnNjcmlwdGluZyUyRnByb2dyYW1tZXJfZ3VpZGUlMkZpbmRleC5odG1sJmFtcDt0aXRsZT1KYXZhJTIwU2NyaXB0aW5nJTIwUHJvZ3JhbW1lciUyN3MlMjBHdWlkZSIgY2xhc3M9InNoYXJlbGluayBkaWdnIiB0aXRsZT0iU3VibWl0IHRoaXMgcGFnZSB0byBEaWdnIj48L2E+PC90ZD4JCTx0ZCBpZD0ic2hhcmUtc2xhc2hkb3QiPjxhIGhyZWY9Imh0dHA6Ly9zbGFzaGRvdC5vcmcvYm9va21hcmsucGw/dGl0bGU9SmF2YSUyMFNjcmlwdGluZyUyMFByb2dyYW1tZXIlMjdzJTIwR3VpZGUmYW1wO3VybD1odHRwJTNBJTJGJTJGZG9jcy5vcmFjbGUuY29tJTJGamF2YXNlJTJGNiUyRmRvY3MlMkZ0ZWNobm90ZXMlMkZndWlkZXMlMkZzY3JpcHRpbmclMkZwcm9ncmFtbWVyX2d1aWRlJTJGaW5kZXguaHRtbCIgY2xhc3M9InNoYXJlbGluayBzbGFzaGRvdCIgdGl0bGU9IlN1Ym1pdCB0aGlzIHBhZ2UgdG8gU2xhc2hkb3QiPjwvYT48L3RkPgkJPHRkIGlkPSJzaGFyZS1ibGFuayI+IDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8L3RkPgo8L3RyPgo8L3Rib2R5PjwvdGFibGU+CjwhLS0gQm9keSB0ZXh0IGJlZ2lucyBoZXJlIC0tPgo8dWw+CjxsaT48c3Bhbj48YSBocmVmPSIjd2hvIj5XaG8gaXMgdGhlIEphdmEgU2NyaXB0aW5nIEFQSQpGb3I/PC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI3BhY2thZ2UiPlNjcmlwdGluZyBQYWNrYWdlPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI2V4YW1wbGVzIj5FeGFtcGxlczwvYT48L3NwYW4+Cjx1bD4KPGxpPjxzcGFuPjxhIGhyZWY9IiNoZWxsb3dvcmxkIj4iSGVsbG8sIFdvcmxkIjwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNldmFsZmlsZSI+RXZhbHVhdGluZyBhIFNjcmlwdApGaWxlPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI3NjcmlwdHZhcnMiPlNjcmlwdCBWYXJpYWJsZXM8L2E+PC9zcGFuPjwvbGk+CjxsaT48c3Bhbj48YSBocmVmPSIjaW52b2tlIj5JbnZva2luZyBTY3JpcHQgRnVuY3Rpb25zIGFuZApNZXRob2RzPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI2ludGVyZmFjZXMiPkltcGxlbWVudGluZyBKYXZhIEludGVyZmFjZXMgYnkKU2NyaXB0czwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNzY29wZXMiPk11bHRpcGxlIFNjb3BlcyBmb3IKU2NyaXB0czwvYT48L3NwYW4+PC9saT4KPC91bD4KPC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2VuZ2luZSI+SmF2YVNjcmlwdCBTY3JpcHQKRW5naW5lPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI2pzdG9qYXZhIj5KYXZhU2NyaXB0IHRvIEphdmEKQ29tbXVuaWNhdGlvbjwvYT48L3NwYW4+Cjx1bD4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2phdmFjbGFzcyI+QWNjZXNzaW5nIEphdmEKQ2xhc3NlczwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2ltcG9ydCI+SW1wb3J0aW5nIEphdmEgUGFja2FnZXMsCkNsYXNzZXM8L2E+PC9zcGFuPjwvbGk+CjxsaT48c3Bhbj48YSBocmVmPSIjanNhcnJheXMiPkNyZWF0aW5nLCBDb252ZXJ0aW5nIGFuZCBVc2luZyBKYXZhCkFycmF5czwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2ltcGxlbWVudCI+SW1wbGVtZW50aW5nIEphdmEKSW50ZXJmYWNlczwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2V4dGVuZGFic3RyYWN0Ij5FeHRlbmRpbmcgQWJzdHJhY3QgSmF2YSBDbGFzc2VzCjwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2V4dGVuZGNvbmNyZXRlIj5FeHRlbmRpbmcgQ29uY3JldGUgSmF2YSBDbGFzc2VzCjwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNqc2ltcGxlbWVudG11bHRpcGxlIj5JbXBsZW1lbnRpbmcgTXVsdGlwbGUgSmF2YSBJbnRlcmZhY2VzCjwvYT48L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxhIGhyZWY9IiNjbGFzc0JvdW5kSW1wbGVtZW50YXRpb25zIj5DbGFzcy1Cb3VuZCBJbXBsZW1lbnRhdGlvbnMKPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI2pzb3ZlcmxvYWQiPk92ZXJsb2FkIFJlc29sdXRpb248L2E+PC9zcGFuPjwvbGk+CjxsaT48c3Bhbj48YSBocmVmPSIjZGF0YVR5cGVNYXBwaW5nIj5NYXBwaW5nIG9mIERhdGEgVHlwZXMgQmV0d2VlbiBKYXZhCmFuZCBKYXZhU2NyaXB0PC9hPjwvc3Bhbj48L2xpPgoKCgo8L3VsPgo8L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI2VuZ2luZWltcGwiPkltcGxlbWVudGluZyBZb3VyIE93biBTY3JpcHQKRW5naW5lPC9hPjwvc3Bhbj48L2xpPgo8bGk+PHNwYW4+PGEgaHJlZj0iI3JlZnMiPlJlZmVyZW5jZXM8L2E+PC9zcGFuPjwvbGk+CjwvdWw+CjxzcGFuPjxhIG5hbWU9IndobyIgaWQ9IndobyI+PC9hPjwvc3Bhbj4KPGgyPjxzcGFuPldobyBpcyB0aGUgSmF2YSBTY3JpcHRpbmcgQVBJIEZvcj88L3NwYW4+PC9oMj4KPHNwYW4+U29tZSB1c2VmdWwgY2hhcmFjdGVyaXN0aWNzIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMKYXJlOjwvc3Bhbj4KPHVsPgo8bGk+PHNwYW4+PGI+Q29udmVuaWVuY2U8L2I+OiBNb3N0IHNjcmlwdGluZyBsYW5ndWFnZXMgYXJlCmR5bmFtaWNhbGx5IHR5cGVkLiBZb3UgY2FuIHVzdWFsbHkgY3JlYXRlIG5ldyB2YXJpYWJsZXMgd2l0aG91dApkZWNsYXJpbmcgdGhlIHZhcmlhYmxlIHR5cGUsIGFuZCB5b3UgY2FuIHJldXNlIHZhcmlhYmxlcyB0byBzdG9yZQpvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcy4gQWxzbywgc2NyaXB0aW5nIGxhbmd1YWdlcyB0ZW5kIHRvCnBlcmZvcm0gbWFueSB0eXBlIGNvbnZlcnNpb25zIGF1dG9tYXRpY2FsbHksIGZvciBleGFtcGxlLApjb252ZXJ0aW5nIHRoZSBudW1iZXIgMTAgdG8gdGhlIHRleHQgIjEwIiBhcyBuZWNlc3NhcnkuPC9zcGFuPjwvbGk+CjxsaT48c3Bhbj48Yj5EZXZlbG9waW5nIHJhcGlkIHByb3RvdHlwZXM8L2I+OiBZb3UgY2FuIGF2b2lkIHRoZQplZGl0LWNvbXBpbGUtcnVuIGN5Y2xlIGFuZCBqdXN0IHVzZSBlZGl0LXJ1biE8L3NwYW4+PC9saT4KPGxpPjxzcGFuPjxiPkFwcGxpY2F0aW9uIGV4dGVuc2lvbi9jdXN0b21pemF0aW9uPC9iPjogWW91IGNhbgoiZXh0ZXJuYWxpemUiIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gLSBsaWtlIGNvbmZpZ3VyYXRpb24Kc2NyaXB0cywgYnVzaW5lc3MgbG9naWMvcnVsZXMgYW5kIG1hdGggZXhwcmVzc2lvbnMgZm9yIGZpbmFuY2lhbAphcHBsaWNhdGlvbnMuPC9zcGFuPjwvbGk+CjxsaT48c3Bhbj48Yj4iQ29tbWFuZCBsaW5lIiBzaGVsbHMgZm9yIGFwcGxpY2F0aW9uczwvYj4gLWZvcgpkZWJ1Z2dpbmcsIHJ1bnRpbWUvZGVwbG95IHRpbWUgY29uZmlndXJhdGlvbiBldGMuIE1vc3QgYXBwbGljYXRpb25zCmhhdmUgYSB3ZWItYmFzZWQgR1VJIGNvbmZpZ3VhcmF0aW9uIHRvb2wgdGhlc2UgZGF5cy4gQnV0CnN5c2FkbWlucy9kZXBsb3llcnMgZnJlcXVlbnRseSBwcmVmZXIgY29tbWFuZCBsaW5lIHRvb2xzLiBJbnN0ZWFkCm9mIGludmVudGluZyBhZC1ob2Mgc2NyaXB0aW5nIGxhbmd1YWdlIGZvciB0aGF0IHB1cnBvc2UsIGEKInN0YW5kYXJkIiBzY3JpcHRpbmcgbGFuZ3VhZ2UgY2FuIGJlIHVzZWQuPC9zcGFuPjwvbGk+CjwvdWw+CjxwPjxzcGFuPlRoZSBKYXZhPGZvbnQgc2l6ZT0iLTEiPjxzdXA+VE08L3N1cD48L2ZvbnQ+IFNjcmlwdGluZyBBUEkKaXMgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW5kZXBlZGVudCBmcmFtZXdvcmsgZm9yIHVzaW5nIHNjcmlwdAplbmdpbmVzIGZyb20gSmF2YSBjb2RlLiBXaXRoIHRoZSBKYXZhIFNjcmlwdGluZyBBUEksIGl0IGlzIHBvc3NpYmxlCnRvIHdyaXRlIGN1c3RvbWl6YWJsZS9leHRlbmRhYmxlIGFwcGxpY2F0aW9ucyBpbiB0aGUgSmF2YSBsYW5ndWFnZQphbmQgbGVhdmUgdGhlIGN1c3RvbWl6YXRpb24gc2NyaXB0aW5nIGxhbmd1YWdlIGNob2ljZSB0byB0aGUgZW5kCnVzZXIuIFRoZSBKYXZhIGFwcGxpY2F0aW9uIGRldmVsb3BlciBuZWVkIG5vdCBjaG9vc2UgdGhlIGV4dGVuc2lvbgpsYW5ndWFnZSBkdXJpbmcgZGV2ZWxvcG1lbnQuIElmIHlvdSB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGgKSlNSLTIyMyBBUEksIHRoZW4geW91ciB1c2VycyBjYW4gdXNlIGFueSBKU1ItMjIzIGNvbXBsaWFudApzY3JpcHRpbmcgbGFuZ3VhZ2UuPC9zcGFuPjwvcD4KPGhyPgo8c3Bhbj48YSBuYW1lPSJwYWNrYWdlIiBpZD0icGFja2FnZSI+PC9hPjwvc3Bhbj4KPGgyPjxzcGFuPlNjcmlwdGluZyBQYWNrYWdlPC9zcGFuPjwvaDI+CjxwPjxzcGFuPlRoZSBKYXZhIFNjcmlwdGluZyBmdW5jdGlvbmFsaXR5IGlzIGluIHRoZSA8Y29kZT48YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmF4L3NjcmlwdC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+amF2YXguc2NyaXB0PC9hPjwvY29kZT4KcGFja2FnZS4gVGhpcyBpcyBhIHJlbGF0aXZlbHkgc21hbGwsIHNpbXBsZSBBUEkuIFRoZSBzdGFydGluZyBwb2ludApvZiB0aGUgc2NyaXB0aW5nIEFQSSBpcyB0aGUgPGNvZGU+U2NyaXB0RW5naW5lTWFuYWdlcjwvY29kZT4gY2xhc3MuCkEgU2NyaXB0RW5naW5lTWFuYWdlciBvYmplY3QgY2FuIGRpc2NvdmVyIHNjcmlwdCBlbmdpbmVzIHRocm91Z2gKdGhlIGphciBmaWxlIHNlcnZpY2UgZGlzY292ZXJ5IG1lY2hhbmlzbS4gSXQgY2FuIGFsc28gaW5zdGFudGlhdGUKU2NyaXB0RW5naW5lIG9iamVjdHMgdGhhdCBpbnRlcnByZXQgc2NyaXB0cyB3cml0dGVuIGluIGEgc3BlY2lmaWMKc2NyaXB0aW5nIGxhbmd1YWdlLiBUaGUgc2ltcGxlc3Qgd2F5IHRvIHVzZSB0aGUgc2NyaXB0aW5nIEFQSSBpcyBhcwpmb2xsb3dzOjwvc3Bhbj48L3A+CjxvbD4KPGxpPjxzcGFuPkNyZWF0ZSBhIDxjb2RlPlNjcmlwdEVuZ2luZU1hbmFnZXI8L2NvZGU+Cm9iamVjdC48L3NwYW4+PC9saT4KPGxpPjxzcGFuPkdldCBhIDxjb2RlPlNjcmlwdEVuZ2luZTwvY29kZT4gb2JqZWN0IGZyb20gdGhlCm1hbmFnZXIuPC9zcGFuPjwvbGk+CjxsaT48c3Bhbj5FdmFsdWF0ZSBzY3JpcHQgdXNpbmcgdGhlIDxjb2RlPlNjcmlwdEVuZ2luZTwvY29kZT4ncwo8Y29kZT5ldmFsPC9jb2RlPiBtZXRob2RzLjwvc3Bhbj48L2xpPgo8L29sPgo8cD48c3Bhbj5Ob3csIGl0IGlzIHRpbWUgdG8gbG9vayBhdCBzb21lIHNhbXBsZSBjb2RlLiBXaGlsZSBpdCBpcwpub3QgbWFuZGF0b3J5LCBpdCBtYXkgYmUgdXNlZnVsIHRvIGtub3cgYSBiaXQgb2YgSmF2YVNjcmlwdCB0byByZWFkCnRoZXNlIGV4YW1wbGVzLjwvc3Bhbj48L3A+Cjxocj4KPHNwYW4+PGEgbmFtZT0iZXhhbXBsZXMiIGlkPSJleGFtcGxlcyI+PC9hPjwvc3Bhbj4KPGgyPjxzcGFuPkV4YW1wbGVzPC9zcGFuPjwvaDI+CjxzcGFuPjxhIG5hbWU9ImhlbGxvd29ybGQiIGlkPSJoZWxsb3dvcmxkIj48L2E+PC9zcGFuPgo8aDM+PHNwYW4+IkhlbGxvLCBXb3JsZCI8L3NwYW4+PC9oMz4KPHA+PHNwYW4+RnJvbSB0aGUgPGNvZGU+U2NyaXB0RW5naW5lTWFuYWdlcjwvY29kZT4gaW5zdGFuY2UsIHdlCnJlcXVlc3QgYSBKYXZhU2NyaXB0IGVuZ2luZSBpbnN0YW5jZSB1c2luZwo8Y29kZT5nZXRFbmdpbmVCeU5hbWU8L2NvZGU+IG1ldGhvZC4gT24gdGhlIHNjcmlwdCBlbmdpbmUsIHRoZQo8Y29kZT5ldmFsPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHRvIGV4ZWN1dGUgYSBnaXZlbiBTdHJpbmcgYXMKSmF2YVNjcmlwdCBjb2RlISBGb3IgYnJldml0eSwgaW4gdGhpcyBhcyB3ZWxsIGFzIGluIHN1YnNlcXVlbnQKZXhhbXBsZXMsIHdlIGhhdmUgbm90IHNob3duIGV4Y2VwdGlvbiBoYW5kbGluZy4gVGhlcmUgYXJlIGNoZWNrZWQKYW5kIHJ1bnRpbWUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSA8Y29kZT5qYXZheC5zY3JpcHQ8L2NvZGU+IEFQSS4KTmVlZGxlc3MgdG8gc2F5LCB5b3UgaGF2ZSB0byBoYW5kbGUgdGhlIGV4Y2VwdGlvbnMKYXBwcm9wcmlhdGVseS48L3NwYW4+PC9wPgo8cHJlPgo8c3Bhbj48Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL0V2YWxTY3JpcHQuamF2YSI+RXZhbFNjcmlwdC5qYXZhPC9hPgoKaW1wb3J0IGphdmF4LnNjcmlwdC4qOwpwdWJsaWMgY2xhc3MgRXZhbFNjcmlwdCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAvLyBjcmVhdGUgYSBzY3JpcHQgZW5naW5lIG1hbmFnZXIKICAgICAgICA8c3BhbiBjbGFzcz0iY2xhc3NyZWYiPlNjcmlwdEVuZ2luZU1hbmFnZXI8L3NwYW4+IGZhY3RvcnkgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwogICAgICAgIC8vIGNyZWF0ZSBhIEphdmFTY3JpcHQgZW5naW5lCiAgICAgICAgPHNwYW4gY2xhc3M9ImNsYXNzcmVmIj5TY3JpcHRFbmdpbmU8L3NwYW4+IGVuZ2luZSA9IGZhY3RvcnkuPHNwYW4gY2xhc3M9Im1ldGhvZHJlZiI+Z2V0RW5naW5lQnlOYW1lPC9zcGFuPigibmFzaG9ybiIpOwogICAgICAgIC8vIGV2YWx1YXRlIEphdmFTY3JpcHQgY29kZSBmcm9tIFN0cmluZwogICAgICAgIGVuZ2luZS48c3BhbiBjbGFzcz0ibWV0aG9kcmVmIj5ldmFsPC9zcGFuPigicHJpbnQoJ0hlbGxvLCBXb3JsZCcpIik7CiAgICB9Cn0KPC9jb2RlPjwvc3Bhbj4KPC9wcmU+Cjxocj4KPGEgbmFtZT0iZXZhbGZpbGUiIGlkPSJldmFsZmlsZSI+PC9hPgo8aDM+RXZhbHVhdGluZyBhIFNjcmlwdCBGaWxlPC9oMz4KPHA+SW4gdGhpcyBleGFtcGxlLCB3ZSBjYWxsIHRoZSA8Y29kZT5ldmFsPC9jb2RlPiBtZXRob2QgdGhhdAphY2NlcHRzIDxjb2RlPmphdmEuaW8uUmVhZGVyPC9jb2RlPiBmb3IgdGhlIGlucHV0IHNvdXJjZS4gVGhlCnNjcmlwdCByZWFkIGJ5IHRoZSBnaXZlbiByZWFkZXIgaXMgZXhlY3V0ZWQuIFRoaXMgd2F5IGl0IGlzCnBvc3NpYmxlIHRvIGV4ZWN1dGUgc2NyaXB0cyBmcm9tIGZpbGVzLCBVUkxzIGFuZCByZXNvdXJjZXMgYnkKd3JhcHBpbmcgdGhlIHJlbGV2YW50IGlucHV0IHN0cmVhbSBvYmplY3RzIGFzIHJlYWRlcnMuPC9wPgo8cHJlPgo8Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL0V2YWxGaWxlLmphdmEiPkV2YWxGaWxlLmphdmE8L2E+CgppbXBvcnQgamF2YXguc2NyaXB0Lio7CgpwdWJsaWMgY2xhc3MgRXZhbEZpbGUgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgLy8gY3JlYXRlIGEgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyCiAgICAgICAgPHNwYW4gY2xhc3M9ImNsYXNzcmVmIj5TY3JpcHRFbmdpbmVNYW5hZ2VyPC9zcGFuPiBmYWN0b3J5ID0gbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKTsKICAgICAgICAvLyBjcmVhdGUgSmF2YVNjcmlwdCBlbmdpbmUKICAgICAgICA8c3BhbiBjbGFzcz0iY2xhc3NyZWYiPlNjcmlwdEVuZ2luZTwvc3Bhbj4gZW5naW5lID0gZmFjdG9yeS48c3BhbiBjbGFzcz0ibWV0aG9kcmVmIj5nZXRFbmdpbmVCeU5hbWU8L3NwYW4+KCJuYXNob3JuIik7CiAgICAgICAgLy8gZXZhbHVhdGUgSmF2YVNjcmlwdCBjb2RlIGZyb20gZ2l2ZW4gZmlsZSAtIHNwZWNpZmllZCBieSBmaXJzdCBhcmd1bWVudAogICAgICAgIGVuZ2luZS48c3BhbiBjbGFzcz0ibWV0aG9kcmVmIj5ldmFsPC9zcGFuPihuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3NbMF0pKTsKICAgIH0KfQo8L2NvZGU+CjwvcHJlPgpMZXQgdXMgYXNzdW1lIHRoYXQgd2UgaGF2ZSB0aGUgZmlsZSBuYW1lZCA8YSBocmVmPSJzb3VyY2UvdGVzdC5qcyI+dGVzdC5qczwvYT4gd2l0aCB0aGUKZm9sbG93aW5nIHRleHQ6CjxwcmU+PGNvZGU+CnByaW50KCJUaGlzIGlzIGhlbGxvIGZyb20gdGVzdC5qcyIpOwo8L2NvZGU+CjwvcHJlPgpXZSBjYW4gcnVuIHRoZSBhYm92ZSBKYXZhIGFzCjxwcmU+PGNvZGU+CmphdmEgRXZhbEZpbGUgdGVzdC5qcwo8L2NvZGU+CjwvcHJlPgo8aHI+CjxhIG5hbWU9InNjcmlwdHZhcnMiIGlkPSJzY3JpcHR2YXJzIj48L2E+CjxoMz5TY3JpcHQgVmFyaWFibGVzPC9oMz4KPHA+V2hlbiB5b3UgZW1iZWQgc2NyaXB0IGVuZ2luZXMgYW5kIHNjcmlwdHMgd2l0aCB5b3VyIEphdmEKYXBwbGljYXRpb24sIHlvdSBtYXkgd2FudCB0byBleHBvc2UgeW91ciBhcHBsaWNhdGlvbiBvYmplY3RzIGFzCmdsb2JhbCB2YXJpYWJsZXMgdG8gc2NyaXB0cy4gVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgeW91IGNhbgpleHBvc2UgeW91ciBhcHBsaWNhdGlvbiBvYmplY3RzIGFzIGdsb2JhbCB2YXJpYWJsZXMgdG8gYSBzY3JpcHQuIFdlCmNyZWF0ZSBhIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4gaW4gdGhlIGFwcGxpY2F0aW9uIGFuZCBleHBvc2UKdGhlIHNhbWUgYXMgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgbmFtZSAiZmlsZSIuIFRoZSBzY3JpcHQgY2FuCmFjY2VzcyB0aGUgdmFyaWFibGUgLSBmb3IgZXhhbXBsZSwgaXQgY2FuIGNhbGwgcHVibGljIG1ldGhvZHMgb24KaXQuIE5vdGUgdGhhdCB0aGUgc3ludGF4IHRvIGFjY2VzcyBKYXZhIG9iamVjdHMsIG1ldGhvZHMgYW5kIGZpZWxkcwppcyBkZXBlbmRlbnQgb24gdGhlIHNjcmlwdGluZyBsYW5ndWFnZS4gSmF2YVNjcmlwdCBzdXBwb3J0cyB0aGUKbW9zdCAibmF0dXJhbCIgSmF2YS1saWtlIHN5bnRheC48L3A+CjxwPgpOYXNob3JuIHNjcmlwdCBlbmdpbmUgcHJlLWRlZmluZXMgdHdvIGdsb2JhbCB2YXJpYWJsZXMgbmFtZWQgImNvbnRleHQiCmFuZCAiZW5naW5lIi4gVGhlICJjb250ZXh0IiB2YXJpYWJsZSBpcyBvZiB0eXBlIGphdmF4LnNjcmlwdC5TY3JpcHRDb250ZXh0CmFuZCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgU2NyaXB0Q29udGV4dCBpbnN0YW5jZSBwYXNzZWQgdG8gc2NyaXB0IGVuZ2luZSdzCmV2YWwgbWV0aG9kLiBUaGUgImVuZ2luZSIgdmFyaWFibGUgaXMgb2YgdHlwZSBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lIGFuZApyZWZlcnMgdG8gdGhlIGN1cnJlbnQgbmFzaG9ybiBzY3JpcHQgZW5naW5lIGluc3RhbmNlIGV2YWx1YXRpbmcgdGhlIHNjcmlwdC4KQm90aCBvZiB0aGVzZSB2YXJpYWJsZXMgYXJlIG5vbi13cml0YWJsZSwgbm9uLWVudW1lcmFibGUgYW5kIG5vbi1jb25maWd1cmFibGUKLSB3aGljaCBpbXBsaWVzIHNjcmlwdCBjb2RlIGNhbiBub3Qgd3JpdGUgb3ZlcndyaXRlIHRoZSB2YWx1ZSwgZm9yLi5sb29wIGl0ZXJhdGlvbgpvbiBnbG9iYWwgb2JqZWN0IHdpbGwgbm90IGl0ZXJhdGUgdGhlc2UgdmFyaWFibGVzIGFuZCB0aGVzZSB2YXJpYWJsZXMgY2FuIG5vdCBiZQpkZWxldGVkIGJ5IHNjcmlwdC4KPHByZT48Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL1NjcmlwdFZhcnMuamF2YSI+U2NyaXB0VmFycy5qYXZhPC9hPgoKaW1wb3J0IGphdmF4LnNjcmlwdC4qOwppbXBvcnQgamF2YS5pby4qOwoKcHVibGljIGNsYXNzIFNjcmlwdFZhcnMgeyAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFNjcmlwdEVuZ2luZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCk7CiAgICAgICAgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG1hbmFnZXIuZ2V0RW5naW5lQnlOYW1lKCJuYXNob3JuIik7CgogICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJ0ZXN0LnR4dCIpOwogICAgICAgIC8vIGV4cG9zZSBGaWxlIG9iamVjdCBhcyB2YXJpYWJsZSB0byBzY3JpcHQKICAgICAgICBlbmdpbmUuPHNwYW4gY2xhc3M9Im1ldGhvZHJlZiI+cHV0PC9zcGFuPigiZmlsZSIsIGYpOwoKICAgICAgICAvLyBldmFsdWF0ZSBhIHNjcmlwdCBzdHJpbmcuIFRoZSBzY3JpcHQgYWNjZXNzZXMgImZpbGUiIAogICAgICAgIC8vIHZhcmlhYmxlIGFuZCBjYWxscyBtZXRob2Qgb24gaXQKICAgICAgICBlbmdpbmUuZXZhbCgicHJpbnQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkiKTsKICAgIH0KfQoKPC9jb2RlPgo8L3ByZT4KPGhyPgo8YSBuYW1lPSJpbnZva2UiIGlkPSJpbnZva2UiPjwvYT4KPGgzPkludm9raW5nIFNjcmlwdCBGdW5jdGlvbnMgYW5kIE1ldGhvZHM8L2gzPgo8cD5Tb21ldGltZXMgeW91IG1heSB3YW50IHRvIGNhbGwgYSBzcGVjaWZpYyBzY3JpcHRpbmcgZnVuY3Rpb24KcmVwZWF0ZWRseSAtIGZvciBleGFtcGxlLCB5b3VyIGFwcGxpY2F0aW9uIG1lbnUgZnVuY3Rpb25hbGl0eSBtaWdodApiZSBpbXBsZW1lbnRlZCBieSBhIHNjcmlwdC4gSW4geW91ciBtZW51J3MgYWN0aW9uIGV2ZW50IGhhbmRsZXIgeW91Cm1heSB3YW50IHRvIGNhbGwgYSBzcGVjaWZpYyBzY3JpcHQgZnVuY3Rpb24uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZQpkZW1vbnN0cmF0ZXMgaW52b2tpbmcgYSBzcGVjaWZpYyBzY3JpcHQgZnVuY3Rpb24gZnJvbSBKYXZhCmNvZGUuPC9wPgo8cHJlPjxjb2RlPgovLyA8YSBocmVmPSJzb3VyY2UvSW52b2tlU2NyaXB0RnVuY3Rpb24uamF2YSI+SW52b2tlU2NyaXB0RnVuY3Rpb24uamF2YTwvYT4KCmltcG9ydCBqYXZheC5zY3JpcHQuKjsKCnB1YmxpYyBjbGFzcyBJbnZva2VTY3JpcHRGdW5jdGlvbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTY3JpcHRFbmdpbmVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwogICAgICAgIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBtYW5hZ2VyLmdldEVuZ2luZUJ5TmFtZSgibmFzaG9ybiIpOwoKICAgICAgICAvLyBKYXZhU2NyaXB0IGNvZGUgaW4gYSBTdHJpbmcKICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImZ1bmN0aW9uIGhlbGxvKG5hbWUpIHsgcHJpbnQoJ0hlbGxvLCAnICsgbmFtZSk7IH0iOwogICAgICAgIC8vIGV2YWx1YXRlIHNjcmlwdAogICAgICAgIGVuZ2luZS5ldmFsKHNjcmlwdCk7CgogICAgICAgIC8vIDxjb2RlPmphdmF4LnNjcmlwdC5JbnZvY2FibGU8L2NvZGU+IGlzIGFuIG9wdGlvbmFsIGludGVyZmFjZS4KICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHlvdXIgc2NyaXB0IGVuZ2luZSBpbXBsZW1lbnRzIGl0IG9yIG5vdCEKICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIEphdmFTY3JpcHQgZW5naW5lIGltcGxlbWVudHMgSW52b2NhYmxlIGludGVyZmFjZS4KICAgICAgICA8c3BhbiBjbGFzcz0iY2xhc3NyZWYiPkludm9jYWJsZTwvc3Bhbj4gaW52ID0gKEludm9jYWJsZSkgZW5naW5lOwoKICAgICAgICAvLyBpbnZva2UgdGhlIGdsb2JhbCBmdW5jdGlvbiBuYW1lZCAiaGVsbG8iCiAgICAgICAgaW52LjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmludm9rZUZ1bmN0aW9uPC9zcGFuPigiaGVsbG8iLCAiU2NyaXB0aW5nISEiICk7CiAgICB9Cn0KCjwvY29kZT4KPC9wcmU+CjxwPklmIHlvdXIgc2NyaXB0aW5nIGxhbmd1YWdlIGlzIG9iamVjdCBiYXNlZCAobGlrZSBKYXZhU2NyaXB0KSBvcgpvYmplY3Qtb3JpZW50ZWQsIHRoZW4geW91IGNhbiBpbnZva2UgYSBzY3JpcHQgbWV0aG9kIG9uIGEgc2NyaXB0Cm9iamVjdC48L3A+CjxwcmU+PGNvZGU+Ci8vIDxhIGhyZWY9InNvdXJjZS9JbnZva2VTY3JpcHRNZXRob2QuamF2YSI+SW52b2tlU2NyaXB0TWV0aG9kLmphdmE8L2E+CgppbXBvcnQgamF2YXguc2NyaXB0Lio7CgpwdWJsaWMgY2xhc3MgSW52b2tlU2NyaXB0TWV0aG9kIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFNjcmlwdEVuZ2luZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCk7CiAgICAgICAgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG1hbmFnZXIuZ2V0RW5naW5lQnlOYW1lKCJuYXNob3JuIik7CgogICAgICAgIC8vIEphdmFTY3JpcHQgY29kZSBpbiBhIFN0cmluZy4gVGhpcyBjb2RlIGRlZmluZXMgYSBzY3JpcHQgb2JqZWN0ICdvYmonCiAgICAgICAgLy8gd2l0aCBvbmUgbWV0aG9kIGNhbGxlZCAnaGVsbG8nLiAgICAgICAgCiAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJ2YXIgb2JqID0gbmV3IE9iamVjdCgpOyBvYmouaGVsbG8gPSBmdW5jdGlvbihuYW1lKSB7IHByaW50KCdIZWxsbywgJyArIG5hbWUpOyB9IjsKICAgICAgICAvLyBldmFsdWF0ZSBzY3JpcHQKICAgICAgICBlbmdpbmUuZXZhbChzY3JpcHQpOwoKICAgICAgICAvLyA8Y29kZT5qYXZheC5zY3JpcHQuSW52b2NhYmxlPC9jb2RlPiBpcyBhbiBvcHRpb25hbCBpbnRlcmZhY2UuCiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB5b3VyIHNjcmlwdCBlbmdpbmUgaW1wbGVtZW50cyBvciBub3QhCiAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBKYXZhU2NyaXB0IGVuZ2luZSBpbXBsZW1lbnRzIEludm9jYWJsZSBpbnRlcmZhY2UuCiAgICAgICAgPHNwYW4gY2xhc3M9ImNsYXNzcmVmIj5JbnZvY2FibGU8L3NwYW4+IGludiA9IChJbnZvY2FibGUpIGVuZ2luZTsKCiAgICAgICAgLy8gZ2V0IHNjcmlwdCBvYmplY3Qgb24gd2hpY2ggd2Ugd2FudCB0byBjYWxsIHRoZSBtZXRob2QKICAgICAgICBPYmplY3Qgb2JqID0gZW5naW5lLjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmdldDwvc3Bhbj4oIm9iaiIpOwoKICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCBuYW1lZCAiaGVsbG8iIG9uIHRoZSBzY3JpcHQgb2JqZWN0ICJvYmoiCiAgICAgICAgaW52LjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmludm9rZU1ldGhvZDwvc3Bhbj4ob2JqLCAiaGVsbG8iLCAiU2NyaXB0IE1ldGhvZCAhISIgKTsKICAgIH0KfQoKPC9jb2RlPgo8L3ByZT4KPGhyPgo8YSBuYW1lPSJpbnRlcmZhY2VzIiBpZD0iaW50ZXJmYWNlcyI+PC9hPgo8aDM+SW1wbGVtZW50aW5nIEphdmEgSW50ZXJmYWNlcyBieSBTY3JpcHRzPC9oMz4KPHA+SW5zdGVhZCBvZiBjYWxsaW5nIHNwZWNpZmljIHNjcmlwdCBmdW5jdGlvbnMgZnJvbSBKYXZhLApzb21ldGltZXMgaXQgaXMgY29udmVuaWVudCB0byBpbXBsZW1lbnQgYSBKYXZhIGludGVyZmFjZSBieSBzY3JpcHQKZnVuY3Rpb25zIG9yIG1ldGhvZHMuIEFsc28sIGJ5IHVzaW5nIGludGVyZmFjZXMgd2UgY2FuIGF2b2lkIGhhdmluZwp0byB1c2UgdGhlIDxjb2RlPmphdmF4LnNjcmlwdDwvY29kZT4gQVBJIGluIG1hbnkgcGxhY2VzLiBXZSBjYW4gZ2V0CmFuIGludGVyZmFjZSBpbXBsZW1lbnRvciBvYmplY3QgYW5kIHBhc3MgaXQgdG8gdmFyaW91cyBKYXZhIEFQSXMuClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaW1wbGVtZW50aW5nIHRoZQo8Y29kZT5qYXZhLmxhbmcuUnVubmFibGU8L2NvZGU+IGludGVyZmFjZSB3aXRoIGEgc2NyaXB0LjwvcD4KPHByZT48Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL1J1bm5hYmxlSW1wbC5qYXZhIj5SdW5uYWJsZUltcGwuamF2YTwvYT4KCmltcG9ydCBqYXZheC5zY3JpcHQuKjsKCnB1YmxpYyBjbGFzcyBSdW5uYWJsZUltcGwgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgU2NyaXB0RW5naW5lTWFuYWdlciBtYW5hZ2VyID0gbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKTsKICAgICAgICBTY3JpcHRFbmdpbmUgZW5naW5lID0gbWFuYWdlci5nZXRFbmdpbmVCeU5hbWUoIm5hc2hvcm4iKTsKCiAgICAgICAgLy8gSmF2YVNjcmlwdCBjb2RlIGluIGEgU3RyaW5nCiAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJmdW5jdGlvbiBydW4oKSB7IHByaW50KCdydW4gY2FsbGVkJyk7IH0iOwoKICAgICAgICAvLyBldmFsdWF0ZSBzY3JpcHQKICAgICAgICBlbmdpbmUuZXZhbChzY3JpcHQpOwoKICAgICAgICA8c3BhbiBjbGFzcz0iY2xhc3NyZWYiPkludm9jYWJsZTwvc3Bhbj4gaW52ID0gKEludm9jYWJsZSkgZW5naW5lOwoKICAgICAgICAvLyBnZXQgUnVubmFibGUgaW50ZXJmYWNlIG9iamVjdCBmcm9tIGVuZ2luZS4gVGhpcyBpbnRlcmZhY2UgbWV0aG9kcwogICAgICAgIC8vIGFyZSBpbXBsZW1lbnRlZCBieSBzY3JpcHQgZnVuY3Rpb25zIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUuCiAgICAgICAgUnVubmFibGUgciA9IGludi48c3BhbiBjbGFzcz0ibWV0aG9kcmVmIj5nZXRJbnRlcmZhY2U8L3NwYW4+KFJ1bm5hYmxlLmNsYXNzKTsKCiAgICAgICAgLy8gc3RhcnQgYSBuZXcgdGhyZWFkIHRoYXQgcnVucyB0aGUgc2NyaXB0IGltcGxlbWVudGVkCiAgICAgICAgLy8gcnVubmFibGUgaW50ZXJmYWNlCiAgICAgICAgVGhyZWFkIHRoID0gbmV3IFRocmVhZChyKTsKICAgICAgICB0aC5zdGFydCgpOwogICAgICAgIHRoLmpvaW4oKTsKICAgIH0KfQo8L2NvZGU+CjwvcHJlPgo8cD5JZiB5b3VyIHNjcmlwdGluZyBsYW5ndWFnZSBpcyBvYmplY3QtYmFzZWQgb3Igb2JqZWN0LW9yaWVudGVkLAppdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBKYXZhIGludGVyZmFjZSBieSBzY3JpcHQgbWV0aG9kcyBvbgpzY3JpcHQgb2JqZWN0cy4gVGhpcyBhdm9pZHMgaGF2aW5nIHRvIGNhbGwgc2NyaXB0IGdsb2JhbCBmdW5jdGlvbnMKZm9yIGludGVyZmFjZSBtZXRob2RzLiBUaGUgc2NyaXB0IG9iamVjdCBjYW4gc3RvcmUgdGhlICJzdGF0ZSIKYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50b3IuPC9wPgo8cHJlPjxjb2RlPgovLyA8YSBocmVmPSJzb3VyY2UvUnVubmFibGVJbXBsT2JqZWN0LmphdmEiPlJ1bm5hYmxlSW1wbE9iamVjdC5qYXZhPC9hPgoKaW1wb3J0IGphdmF4LnNjcmlwdC4qOwoKcHVibGljIGNsYXNzIFJ1bm5hYmxlSW1wbE9iamVjdCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTY3JpcHRFbmdpbmVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwogICAgICAgIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBtYW5hZ2VyLmdldEVuZ2luZUJ5TmFtZSgibmFzaG9ybiIpOwoKICAgICAgICAvLyBKYXZhU2NyaXB0IGNvZGUgaW4gYSBTdHJpbmcKICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInZhciBvYmogPSBuZXcgT2JqZWN0KCk7IG9iai5ydW4gPSBmdW5jdGlvbigpIHsgcHJpbnQoJ3J1biBtZXRob2QgY2FsbGVkJyk7IH0iOwoKICAgICAgICAvLyBldmFsdWF0ZSBzY3JpcHQKICAgICAgICBlbmdpbmUuZXZhbChzY3JpcHQpOwoKICAgICAgICAvLyBnZXQgc2NyaXB0IG9iamVjdCBvbiB3aGljaCB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIHdpdGgKICAgICAgICBPYmplY3Qgb2JqID0gZW5naW5lLjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmdldDwvc3Bhbj4oIm9iaiIpOwoKICAgICAgICA8c3BhbiBjbGFzcz0iY2xhc3NyZWYiPkludm9jYWJsZTwvc3Bhbj4gaW52ID0gKEludm9jYWJsZSkgZW5naW5lOwoKICAgICAgICAvLyBnZXQgUnVubmFibGUgaW50ZXJmYWNlIG9iamVjdCBmcm9tIGVuZ2luZS4gVGhpcyBpbnRlcmZhY2UgbWV0aG9kcwogICAgICAgIC8vIGFyZSBpbXBsZW1lbnRlZCBieSBzY3JpcHQgbWV0aG9kcyBvZiBvYmplY3QgJ29iaicKICAgICAgICBSdW5uYWJsZSByID0gaW52LjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmdldEludGVyZmFjZTwvc3Bhbj4ob2JqLCBSdW5uYWJsZS5jbGFzcyk7CgogICAgICAgIC8vIHN0YXJ0IGEgbmV3IHRocmVhZCB0aGF0IHJ1bnMgdGhlIHNjcmlwdCBpbXBsZW1lbnRlZAogICAgICAgIC8vIHJ1bm5hYmxlIGludGVyZmFjZQogICAgICAgIFRocmVhZCB0aCA9IG5ldyBUaHJlYWQocik7CiAgICAgICAgdGguc3RhcnQoKTsKICAgICAgICB0aC5qb2luKCk7CiAgICB9Cn0KPC9jb2RlPgo8L3ByZT4KPGhyPgo8YSBuYW1lPSJzY29wZXMiIGlkPSJzY29wZXMiPjwvYT4KPGgzPk11bHRpcGxlIFNjb3BlcyBmb3IgU2NyaXB0czwvaDM+CjxwPkluIHRoZSA8YSBocmVmPSIjc2NyaXB0dmFycyI+c2NyaXB0IHZhcmlhYmxlczwvYT4gZXhhbXBsZSwgd2UKc2F3IGhvdyB0byBleHBvc2UgYXBwbGljYXRpb24gb2JqZWN0cyBhcyBzY3JpcHQgZ2xvYmFsIHZhcmlhYmxlcy4KSXQgaXMgcG9zc2libGUgdG8gZXhwb3NlIG11bHRpcGxlIGdsb2JhbCAic2NvcGVzIiBmb3Igc2NyaXB0cy4gQQpzaW5nbGUgc2NvcGUgaXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+amF2YXguc2NyaXB0LkJpbmRpbmdzPC9jb2RlPi4KVGhpcyBpbnRlcmZhY2UgaXMgZGVyaXZlZCBmcm9tIDxjb2RlPmphdmEudXRpbC5NYXAmbHQ7U3RyaW5nLApPYmplY3QmZ3Q7PC9jb2RlPi4gQSBzY29wZSBhIHNldCBvZiBuYW1lLXZhbHVlIHBhaXJzIHdoZXJlIG5hbWUgaXMKYW55IG5vbi1lbXB0eSwgbm9uLW51bGwgU3RyaW5nLgo8Y29kZT5qYXZheC5zY3JpcHQuU2NyaXB0Q29udGV4dDwvY29kZT4gaW50ZXJmYWNlIHN1cHBvcnRzIG11bHRpcGxlCnNjb3BlcyB3aXRoIGFzc29jaWF0ZWQgQmluZGluZ3MgZm9yIGVhY2gKc2NvcGUuIEJ5IGRlZmF1bHQsIGV2ZXJ5IHNjcmlwdCBlbmdpbmUgaGFzIGEgZGVmYXVsdCBzY3JpcHQKY29udGV4dC4gVGhlIGRlZmF1bHQgc2NyaXB0IGNvbnRleHQgaGFzIGF0bGVhc3Qgb25lIHNjb3BlIGNhbGxlZAoiRU5HSU5FX1NDT1BFIi4gVmFyaW91cyBzY29wZXMgc3VwcG9ydGVkIGJ5IGEgc2NyaXB0IGNvbnRleHQgYXJlCmF2YWlsYWJsZSB0aHJvdWdoIDxjb2RlPmdldFNjb3BlczwvY29kZT4gbWV0aG9kLjwvcD4KPHByZT48Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL011bHRpU2NvcGVzLmphdmEiPk11bHRpU2NvcGVzLmphdmE8L2E+CgppbXBvcnQgamF2YXguc2NyaXB0Lio7CgpwdWJsaWMgY2xhc3MgTXVsdGlTY29wZXMgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgU2NyaXB0RW5naW5lTWFuYWdlciBtYW5hZ2VyID0gbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKTsKICAgICAgICBTY3JpcHRFbmdpbmUgZW5naW5lID0gbWFuYWdlci5nZXRFbmdpbmVCeU5hbWUoIm5hc2hvcm4iKTsKCiAgICAgICAgZW5naW5lLnB1dCgieCIsICJoZWxsbyIpOwogICAgICAgIC8vIHByaW50IGdsb2JhbCB2YXJpYWJsZSAieCIKICAgICAgICBlbmdpbmUuZXZhbCgicHJpbnQoeCk7Iik7CiAgICAgICAgLy8gdGhlIGFib3ZlIGxpbmUgcHJpbnRzICJoZWxsbyIKCiAgICAgICAgLy8gTm93LCBwYXNzIGEgZGlmZmVyZW50IHNjcmlwdCBjb250ZXh0CiAgICAgICAgPHNwYW4gY2xhc3M9ImNsYXNzcmVmIj5TY3JpcHRDb250ZXh0PC9zcGFuPiBuZXdDb250ZXh0ID0gbmV3IDxzcGFuIGNsYXNzPSJjbGFzc3JlZiI+U2ltcGxlU2NyaXB0Q29udGV4dDwvc3Bhbj4oKTsKICAgICAgICBuZXdDb250ZXh0LnNldEJpbmRpbmdzKGVuZ2luZS5jcmVhdGVCaW5kaW5ncygpLCBTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSk7CiAgICAgICAgPHNwYW4gY2xhc3M9ImNsYXNzcmVmIj5CaW5kaW5nczwvc3Bhbj4gZW5naW5lU2NvcGUgPSBuZXdDb250ZXh0LjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPmdldEJpbmRpbmdzPC9zcGFuPihTY3JpcHRDb250ZXh0LkVOR0lORV9TQ09QRSk7CgogICAgICAgIC8vIGFkZCBuZXcgdmFyaWFibGUgIngiIHRvIHRoZSBuZXcgZW5naW5lU2NvcGUgICAgICAgIAogICAgICAgIGVuZ2luZVNjb3BlLjxzcGFuIGNsYXNzPSJtZXRob2RyZWYiPnB1dDwvc3Bhbj4oIngiLCAid29ybGQiKTsKCiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgc2FtZSBzY3JpcHQgLSBidXQgdGhpcyB0aW1lIHBhc3MgYSBkaWZmZXJlbnQgc2NyaXB0IGNvbnRleHQKICAgICAgICBlbmdpbmUuZXZhbCgicHJpbnQoeCk7IiwgbmV3Q29udGV4dCk7CiAgICAgICAgLy8gdGhlIGFib3ZlIGxpbmUgcHJpbnRzICJ3b3JsZCIKICAgIH0KfQoKPC9jb2RlPgo8L3ByZT4KPGhyPgo8YSBuYW1lPSJqc2VuZ2luZSIgaWQ9ImpzZW5naW5lIj48L2E+CjxoMj5KYXZhU2NyaXB0IFNjcmlwdCBFbmdpbmU8L2gyPgo8cD5PcmFjbGUncyBpbXBsZW1lbnRhdGlvbiBvZiBKREsgOCBpcyBjby1idW5kbGVkIHdpdGggdGhlIE5hc2hvcm4gRUNNQVNjcmlwdApzY3JpcHQgZW5naW5lLgo8aHI+CjxhIG5hbWU9ImpzdG9qYXZhIiBpZD0ianN0b2phdmEiPjwvYT4KPGgyPkphdmFTY3JpcHQgdG8gSmF2YSBDb21tdW5pY2F0aW9uPC9oMj4KPHA+Rm9yIHRoZSBtb3N0IHBhcnQsIGFjY2Vzc2luZyBKYXZhIGNsYXNzZXMsIG9iamVjdHMgYW5kIG1ldGhvZHMKaXMgc3RyYWlnaHRmb3J3YXJkLiBJbiBwYXJ0aWN1bGFyIGZpZWxkIGFuZCBtZXRob2QgYWNjZXNzIGZyb20KSmF2YVNjcmlwdCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBmcm9tIEphdmEuIFdlIGhpZ2hsaWdodCBpbXBvcnRhbnQKYXNwZWN0cyBvZiBKYXZhU2NyaXB0IEphdmEgYWNjZXNzIGhlcmUuIApUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGFyZSBKYXZhU2NyaXB0IHNuaXBwZXRzIGFjY2Vzc2luZyBKYXZhLiBUaGlzCnNlY3Rpb24gcmVxdWlyZXMga25vd2xlZGdlIG9mIEphdmFTY3JpcHQuIFRoaXMgc2VjdGlvbiBjYW4gYmUKc2tpcHBlZCBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIHVzZSBzb21lIG90aGVyIEpTUi0yMjMgc2NyaXB0aW5nCmxhbmd1YWdlIHJhdGhlciB0aGFuIEphdmFTY3JpcHQuPC9wPgo8aHI+CjxhIG5hbWU9ImpzamF2YWNsYXNzIiBpZD1qc2phdmFsYXNzIj48L2E+CjxoMz5BY2Nlc3NpbmcgSmF2YSBDbGFzc2VzPC9oMz4KPHByZT4KPGNvZGU+Ci8vIDxhIGhyZWY9InNvdXJjZS9qYXZhdHlwZXMuanMiPmphdmF0eXBlcy5qczwvYT4KCiB2YXIgYXJyYXlMaXN0VHlwZSA9IEphdmEudHlwZSgiamF2YS51dGlsLkFycmF5TGlzdCIpCiB2YXIgaW50VHlwZSA9IEphdmEudHlwZSgiaW50IikKIHZhciBzdHJpbmdBcnJheVR5cGUgPSBKYXZhLnR5cGUoImphdmEubGFuZy5TdHJpbmdbXSIpCiB2YXIgaW50MkRBcnJheVR5cGUgPSBKYXZhLnR5cGUoImludFtdW10iKQo8L2NvZGU+CjwvcHJlPiAKCk5vdGUgdGhhdCB0aGUgbmFtZSBvZiB0aGUgdHlwZSBpcyBhbHdheXMgYSBzdHJpbmcgZm9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFlvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSBleHByZXNzaW9ucyB0byBjcmVhdGUgbmV3IGluc3RhbmNlcywgZS5nLjoKCjxwcmU+PGNvZGU+CiB2YXIgYW5BcnJheUxpc3QgPSBuZXcgKEphdmEudHlwZSgiamF2YS51dGlsLkFycmF5TGlzdCIpKQo8L2NvZGU+PC9wcmU+IAoKb3IKCjxwcmU+PGNvZGU+CiB2YXIgQXJyYXlMaXN0ID0gSmF2YS50eXBlKCJqYXZhLnV0aWwuQXJyYXlMaXN0IikKIHZhciBhbkFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QKIHZhciBhbkFycmF5TGlzdFdpdGhTaXplID0gbmV3IEFycmF5TGlzdCgxNikKPC9jb2RlPjwvcHJlPiAKCkluIHRoZSBzcGVjaWFsIGNhc2Ugb2YgaW5uZXIgY2xhc3NlcywgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSBKVk0gZnVsbHkgcXVhbGlmaWVkIG5hbWUsIG1lYW5pbmcgdXNpbmcgdGhlIGRvbGxhciBzaWduIGluIHRoZSBjbGFzcyBuYW1lLCBvciB5b3UgY2FuIHVzZSB0aGUgZG90OgoKPHByZT48Y29kZT4KIHZhciBmdHlwZSA9IEphdmEudHlwZSgiamF2YS5hd3QuZ2VvbS5BcmMyRCRGbG9hdCIpCjwvY29kZT48L3ByZT4gCiAKYW5kCiAKPHByZT48Y29kZT4KIHZhciBmdHlwZSA9IEphdmEudHlwZSgiamF2YS5hd3QuZ2VvbS5BcmMyRC5GbG9hdCIpCjwvY29kZT48L3ByZT4gCgpib3RoIHdvcmsuIE5vdGUgaG93ZXZlciB0aGF0IHVzaW5nIHRoZSBkb2xsYXIgc2lnbiBpcyBmYXN0ZXIsIGFzIEphdmEudHlwZSBmaXJzdCB0cmllcyB0byByZXNvbHZlIHRoZSBjbGFzcyBuYW1lIGFzIGl0IGlzIG9yaWdpbmFsbHkgc3BlY2lmaWVkLCBhbmQgdGhlIGludGVybmFsIEpWTSBuYW1lcyBmb3IgaW5uZXIgY2xhc3NlcyB1c2UgdGhlIGRvbGxhciBzaWduLiBJZiB5b3UgdXNlIHRoZSBkb3QsIEphdmEudHlwZSB3aWxsIGludGVybmFsbHkgZ2V0IGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBhbmQgc3Vic2VxdWVudGx5IHJldHJ5IGJ5IGNoYW5naW5nIHRoZSBsYXN0IGRvdCB0byBkb2xsYXIgc2lnbi4gQXMgYSBtYXR0ZXIgb2YgZmFjdCwgaXQnbGwga2VlcCByZXBsYWNpbmcgZG90cyB3aXRoIGRvbGxhciBzaWducyB1bnRpbCBpdCBlaXRoZXIgc3VjY2Vzc2Z1bGx5IGxvYWRzIHRoZSBjbGFzcyBvciBydW5zIG91dCBvZiBhbGwgZG90cyBpbiB0aGUgbmFtZS4gVGhpcyB3YXkgaXQgY2FuIGNvcnJlY3RseSByZXNvbHZlIGFuZCBsb2FkIGV2ZW4gbXVsdGlwbHkgbmVzdGVkIGlubmVyIGNsYXNzZXMgd2l0aCB0aGUgZG90IG5vdGF0aW9uLiBBZ2FpbiwgdGhpcyB3aWxsIGJlIHNsb3dlciB0aGFuIHVzaW5nIHRoZSBkb2xsYXIgc2lnbnMgaW4gdGhlIG5hbWUuIEFuIGFsdGVybmF0aXZlIHdheSB0byBhY2Nlc3MgdGhlIGlubmVyIGNsYXNzIGlzIGFzIGEgcHJvcGVydHkgb2YgdGhlIG91dGVyIGNsYXNzOgoKPHByZT48Y29kZT4KIHZhciBhcmN0eXBlID0gSmF2YS50eXBlKCJqYXZhLmF3dC5nZW9tLkFyYzJEIikKIHZhciBmdHlwZSA9IGFyY3R5cGUuRmxvYXQKPC9jb2RlPjwvcHJlPiAKPHA+CllvdSBjYW4gYWNjZXNzIGJvdGggc3RhdGljIGFuZCBub24tc3RhdGljIGlubmVyIGNsYXNzZXMuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3MsIHJlbWVtYmVyIHRvIHBhc3MgYW4gaW5zdGFuY2Ugb2YgaXRzIG91dGVyIGNsYXNzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IuCjwvcD4KPHA+CkluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMsIHRoZSB0eXBlIG9iamVjdHMgcmV0dXJuZWQgZnJvbSA8Y29kZT5KYXZhLnR5cGU8L2NvZGU+IGNhbGxzIGNhbiBhbHNvIGJlIHVzZWQgdG8gYWNjZXNzIHRoZQpzdGF0aWMgZmllbGRzIGFuZCBtZXRob2RzIG9mIHRoZSBjbGFzc2VzOgo8cHJlPjxjb2RlPgogdmFyIEZpbGUgPSBKYXZhLnR5cGUoImphdmEuaW8uRmlsZSIpCiBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJuYXNob3JuIiwgIi50bXAiKQo8L2NvZGU+PC9wcmU+IAo8cD4KTWV0aG9kcyB3aXRoIG5hbWVzIG9mIHRoZSBmb3JtIDxjb2RlPmlzWHh4KCk8L2NvZGU+LCA8Y29kZT5nZXRYeHgoKTwvY29kZT4sIGFuZCA8Y29kZT5zZXRYeHgoKTwvY29kZT4gY2FuIGFsc28gYmUgdXNlZCBhcyBwcm9wZXJ0aWVzLCBmb3IgYm90aCBpbnN0YW5jZXMgYW5kIHN0YXRpY3MuCjwvcD4KPHA+CkEgdHlwZSBvYmplY3QgcmV0dXJuZWQgZnJvbSA8Y29kZT5KYXZhLnR5cGU8L2NvZGU+IGlzIGRpc3RpbmN0IGZyb20gYSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IG9iamVjdC4gWW91IGNhbiBvYnRhaW4gb25lIGZyb20gdGhlIG90aGVyIHVzaW5nIHByb3BlcnRpZXMgPGNvZGU+Y2xhc3M8L2NvZGU+IGFuZCA8Y29kZT5zdGF0aWM8L2NvZGU+IG9uIHRoZW0uCjxwcmU+PGNvZGU+CiB2YXIgQXJyYXlMaXN0ID0gSmF2YS50eXBlKCJqYXZhLnV0aWwuQXJyYXlMaXN0IikKIHZhciBhID0gbmV3IEFycmF5TGlzdAoKIC8vIEFsbCBvZiB0aGUgZm9sbG93aW5nIHByaW50IHRydWU6CiBwcmludCgiVHlwZSBhY3RzIGFzIHRhcmdldCBvZiBpbnN0YW5jZW9mOiAiICsgKGEgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQogcHJpbnQoIkNsYXNzIGRvZXNuJ3QgYWN0IGFzIHRhcmdldCBvZiBpbnN0YW5jZW9mOiAiICsgIShhIGluc3RhbmNlb2YgYS5nZXRDbGFzcygpKSkKIHByaW50KCJUeXBlIGlzIG5vdCBzYW1lIGFzIGluc3RhbmNlJ3MgZ2V0Q2xhc3MoKTogIiArIChhLmdldENsYXNzKCkgIT09IEFycmF5TGlzdCkpCiBwcmludCgiVHlwZSdzIGBjbGFzc2AgcHJvcGVydHkgaXMgc2FtZSBhcyBpbnN0YW5jZSBnZXRDbGFzcygpOiAiICsgKGEuZ2V0Q2xhc3MoKSA9PT0gQXJyYXlMaXN0LmNsYXNzKSkKIHByaW50KCJUeXBlIGlzIHNhbWUgYXMgaW5zdGFuY2UgZ2V0Q2xhc3MoKSdzIGBzdGF0aWNgIHByb3BlcnR5OiAiICsgKGEuZ2V0Q2xhc3MoKS5zdGF0aWMgPT09IEFycmF5TGlzdCkpCjwvY29kZT48L3ByZT4gCjxwPgpZb3UgY2FuIHRoaW5rIG9mIHRoZSB0eXBlIG9iamVjdCBhcyBzaW1pbGFyIHRvIHRoZSBjbGFzcyBuYW1lcyBhcyB1c2VkIGluIEphdmEgc291cmNlIGNvZGU6IHlvdSB1c2UgdGhlbSBhcyB0aGUKYXJndW1lbnRzIHRvIHRoZSA8Y29kZT5uZXc8L2NvZGU+IGFuZCA8Y29kZT5pbnN0YW5jZW9mPC9jb2RlPiBvcGVyYXRvcnMgYW5kIGFzIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBzdGF0aWMgZmllbGRzCmFuZCBtZXRob2RzLCBidXQgdGhleSBhcmUgZGlmZmVyZW50IHRoYW4gdGhlIHJ1bnRpbWUgPGNvZGU+Q2xhc3M8L2NvZGU+IG9iamVjdHMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0Q2xhc3MoKTwvY29kZT4gY2FsbHMuClN5bnRhY3RpY2FsbHkgYW5kIHNlbWFudGljYWxseSwgdGhpcyBzZXBhcmF0aW9uIHByb2R1Y2VzIGNvZGUgdGhhdCBpcyBtb3N0IHNpbWlsYXIgdG8gSmF2YSBjb2RlLCB3aGVyZSBhIGRpc3RpbmN0aW9uCmJldHdlZW4gY29tcGlsZS10aW1lIGNsYXNzIGV4cHJlc3Npb25zIGFuZCBydW50aW1lIGNsYXNzIG9iamVjdHMgYWxzbyBleGlzdHMuIChBbHNvLCBKYXZhIGNhbid0IGhhdmUgdGhlIGVxdWl2YWxlbnQgb2YgPGNvZGU+c3RhdGljPC9jb2RlPgpwcm9wZXJ0eSBvbiBhIDxjb2RlPkNsYXNzPC9jb2RlPiBvYmplY3Qgc2luY2UgY29tcGlsZS10aW1lIGNsYXNzIGV4cHJlc3Npb25zIGFyZSBuZXZlciByZWlmaWVkIGFzIG9iamVjdHMpLgo8L3A+Cjxocj4KPGEgbmFtZT0ianNpbXBvcnQiIGlkPSJqc2ltcG9ydCI+PC9hPgo8aDM+SW1wb3J0aW5nIEphdmEgUGFja2FnZXMsIENsYXNzZXM8L2gzPgo8cD5UaGUgYnVpbHQtaW4gZnVuY3Rpb25zIDxjb2RlPmltcG9ydFBhY2thZ2U8L2NvZGU+IChpbiBjb21wYXRpYmlsaXR5IHNjcmlwdCkgYW5kCjxjb2RlPmltcG9ydENsYXNzPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBpbXBvcnQgSmF2YSBwYWNrYWdlcyBhbmQKY2xhc3Nlcy48L3A+CjxwcmU+PGNvZGU+CgovLyA8YSBocmVmPSJzb3VyY2UvaW1wb3J0cGFja2FnZWNsYXNzLmpzIj5pbXBvcnRwYWNrYWdlY2xhc3MuanM8L2E+CgovLyBsb2FkIGNvbXBhdGliaWxpdHkgc2NyaXB0CmxvYWQoIm5hc2hvcm46bW96aWxsYV9jb21wYXQuanMiKTsKLy8gSW1wb3J0IEphdmEgcGFja2FnZXMgYW5kIGNsYXNzZXMgCi8vIGxpa2UgaW1wb3J0IHBhY2thZ2UuKjsgaW4gSmF2YQo8c3BhbiBjbGFzcz0iZnVuY3Rpb25yZWYiPmltcG9ydFBhY2thZ2U8L3NwYW4+KGphdmEuYXd0KTsKLy8gbGlrZSBpbXBvcnQgamF2YS5hd3QuRnJhbWUgaW4gSmF2YQo8c3BhbiBjbGFzcz0iZnVuY3Rpb25yZWYiPmltcG9ydENsYXNzPC9zcGFuPihqYXZhLmF3dC5GcmFtZSk7Ci8vIENyZWF0ZSBKYXZhIE9iamVjdHMgYnkgIm5ldyBDbGFzc05hbWUiCnZhciBmcmFtZSA9IG5ldyBqYXZhLmF3dC5GcmFtZSgiaGVsbG8iKTsKLy8gQ2FsbCBKYXZhIHB1YmxpYyBtZXRob2RzIGZyb20gc2NyaXB0CmZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci8vIEFjY2VzcyAiSmF2YUJlYW4iIHByb3BlcnRpZXMgbGlrZSAiZmllbGRzIgpwcmludChmcmFtZS50aXRsZSk7CjwvY29kZT4KPC9wcmU+CjxwPlRoZSA8c3BhbiBjbGFzcz0ib2JqZWN0cmVmIj5QYWNrYWdlczwvc3Bhbj4gZ2xvYmFsIHZhcmlhYmxlIGNhbgpiZSB1c2VkIHRvIGFjY2VzcyBKYXZhIHBhY2thZ2VzLiBFeGFtcGxlczoKPGNvZGU+UGFja2FnZXMuamF2YS51dGlsLlZlY3RvcjwvY29kZT4sCjxjb2RlPlBhY2thZ2VzLmphdmF4LnN3aW5nLkpGcmFtZTwvY29kZT4uIFBsZWFzZSBub3RlIHRoYXQgImphdmEiCmlzIGEgc2hvcnRjdXQgZm9yICJQYWNrYWdlcy5qYXZhIi4gVGhlcmUgYXJlIGVxdWl2YWxlbnQgc2hvcnRjdXRzCmZvciBqYXZheCwgb3JnLCBlZHUsIGNvbSwgbmV0IHByZWZpeGVzLCBzbyBwcmF0aWNhbGx5IGFsbCBKREsKcGxhdGZvcm0gY2xhc3NlcyBjYW4gYmUgYWNjZXNzZWQgd2l0aG91dCB0aGUgIlBhY2thZ2VzIiBwcmVmaXguPC9wPgo8cD5Ob3RlIHRoYXQgamF2YS5sYW5nIGlzIG5vdCBpbXBvcnRlZCBieSBkZWZhdWx0ICh1bmxpa2UgSmF2YSkKYmVjYXVzZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiBjb25mbGljdHMgd2l0aCBKYXZhU2NyaXB0J3MgYnVpbHQtaW4KT2JqZWN0LCBCb29sZWFuLCBNYXRoIGFuZCBzbyBvbi48L3A+CjxwPjxjb2RlPmltcG9ydFBhY2thZ2U8L2NvZGU+IGFuZCA8Y29kZT5pbXBvcnRDbGFzczwvY29kZT4KZnVuY3Rpb25zICJwb2xsdXRlIiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHNjb3BlIG9mIEphdmFTY3JpcHQuIFRvCmF2b2lkIHRoYXQsIHlvdSBtYXkgdXNlIDxzcGFuIGNsYXNzPSJmdW5jdGlvbnJlZiI+SmF2YUltcG9ydGVyPC9zcGFuPi48L3A+CjxwcmU+PGNvZGU+CgovLyA8YSBocmVmPSJzb3VyY2UvamF2YWltcG9ydGVyLmpzIj5qYXZhaW1wb3J0ZXIuanM8L2E+CgovLyBjcmVhdGUgSmF2YUltcG9ydGVyIHdpdGggc3BlY2lmaWMgcGFja2FnZXMgYW5kIGNsYXNzZXMgdG8gaW1wb3J0Cgp2YXIgU3dpbmdHdWkgPSBuZXcgPHNwYW4gY2xhc3M9ImZ1bmN0aW9ucmVmIj5KYXZhSW1wb3J0ZXI8L3NwYW4+KGphdmF4LnN3aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc3dpbmcuZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5zd2luZy5ib3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmF3dC5ldmVudCk7CndpdGggKFN3aW5nR3VpKSB7CiAgICAvLyB3aXRoaW4gdGhpcyAnd2l0aCcgc3RhdGVtZW50LCB3ZSBjYW4gYWNjZXNzIFN3aW5nIGFuZCBBV1QKICAgIC8vIGNsYXNzZXMgYnkgdW5xdWFsaWZpZWQgKHNpbXBsZSkgbmFtZXMuCgogICAgdmFyIG15YnV0dG9uID0gbmV3IEpCdXR0b24oInRlc3QiKTsKICAgIHZhciBteWZyYW1lID0gbmV3IEpGcmFtZSgidGVzdCIpOwp9Cgo8L2NvZGU+CjwvcHJlPgo8aHI+CjxhIG5hbWU9ImpzYXJyYXlzIiBpZD0ianNhcnJheXMiPjwvYT4KPGgzPkNyZWF0aW5nLCBDb252ZXJ0aW5nIGFuZCBVc2luZyBKYXZhIEFycmF5czwvaDM+CjxwPgpBcnJheSBlbGVtZW50IGFjY2VzcyBvciBsZW5ndGggYWNjZXNzIGlzIHRoZSBzYW1lIGFzIGluIEphdmEuPC9wPgo8cHJlPjxjb2RlPgovLyA8YSBocmVmPSJzb3VyY2UvamF2YWFycmF5LmpzIj5qYXZhYXJyYXkuanM8L2E+CgovLyBjcmVhdGUgSmF2YSBTdHJpbmcgYXJyYXkgb2YgNSBlbGVtZW50cwp2YXIgU3RyaW5nQXJyYXkgPSBKYXZhLnR5cGUoImphdmEubGFuZy5TdHJpbmdbXSIpOwp2YXIgYSA9IG5ldyBTdHJpbmdBcnJheSg1KTsKCi8vIEFjY2Vzc2luZyBlbGVtZW50cyBhbmQgbGVuZ3RoIGFjY2VzcyBpcyBieSB1c3VhbCBKYXZhIHN5bnRheAphWzBdID0gInNjcmlwdGluZyBpcyBncmVhdCEiOwpwcmludChhLmxlbmd0aCk7CnByaW50KGFbMF0pOwo8L2NvZGU+CjwvcHJlPgo8cD4KSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjb252ZXJ0IGJldHdlZW4gSmF2YVNjcmlwdCBhbmQgSmF2YSBhcnJheXMuCkdpdmVuIGEgSmF2YVNjcmlwdCBhcnJheSBhbmQgYSBKYXZhIHR5cGUsIDxjb2RlPkphdmEudG88L2NvZGU+IHJldHVybnMgYSBKYXZhIGFycmF5IHdpdGggdGhlIHNhbWUgaW5pdGlhbCBjb250ZW50cywgYW5kIHdpdGggdGhlIHNwZWNpZmllZCBhcnJheSB0eXBlLiAKPC9wPgo8cHJlPjxjb2RlPgogdmFyIGFuQXJyYXkgPSBbMSwgIjEzIiwgZmFsc2VdCiB2YXIgamF2YUludEFycmF5ID0gSmF2YS50byhhbkFycmF5LCAiaW50W10iKQogcHJpbnQoamF2YUludEFycmF5WzBdKSAvLyBwcmludHMgMQogcHJpbnQoamF2YUludEFycmF5WzFdKSAvLyBwcmludHMgMTMsIGFzIHN0cmluZyAiMTMiIHdhcyBjb252ZXJ0ZWQgdG8gbnVtYmVyIDEzIGFzIHBlciBFQ01BU2NyaXB0IFRvTnVtYmVyIGNvbnZlcnNpb24KIHByaW50KGphdmFJbnRBcnJheVsyXSkgLy8gcHJpbnRzIDAsIGFzIGJvb2xlYW4gZmFsc2Ugd2FzIGNvbnZlcnRlZCB0byBudW1iZXIgMCBhcyBwZXIgRUNNQVNjcmlwdCBUb051bWJlciBjb252ZXJzaW9uCjwvY29kZT48L3ByZT4KPHA+CllvdSBjYW4gdXNlIGVpdGhlciBhIHN0cmluZyBvciBhIHR5cGUgb2JqZWN0IHJldHVybmVkIGZyb20gPGNvZGU+SmF2YS50eXBlKCk8L2NvZGU+IHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIGFycmF5LiAKWW91IGNhbiBhbHNvIG9taXQgdGhlIGFycmF5IHR5cGUsIGluIHdoaWNoIGNhc2UgYSA8Y29kZT5PYmplY3RbXTwvY29kZT4gd2lsbCBiZSBjcmVhdGVkLgo8L3A+CjxwPgpHaXZlbiBhIEphdmEgYXJyYXkgb3IgQ29sbGVjdGlvbiwgPGNvZGU+SmF2YS5mcm9tPC9jb2RlPiByZXR1cm5zIGEgSmF2YVNjcmlwdCBhcnJheSB3aXRoIGEgc2hhbGxvdyBjb3B5IG9mIGl0cyBjb250ZW50cy4gTm90ZSB0aGF0IGluIG1vc3QgY2FzZXMsIHlvdSBjYW4gdXNlIEphdmEgYXJyYXlzIGFuZCBsaXN0cyBuYXRpdmVseSBpbiBOYXNob3JuOyBpbiBjYXNlcyB3aGVyZSBmb3Igc29tZSByZWFzb24geW91IG5lZWQgdG8gaGF2ZSBhbiBhY3R1YWwgSmF2YVNjcmlwdCBuYXRpdmUgYXJyYXkgKGUuZy4gdG8gd29yayB3aXRoIHRoZSBhcnJheSBjb21wcmVoZW5zaW9ucyBmdW5jdGlvbnMpLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGlzIG1ldGhvZC4KPC9wPgo8cHJlPjxjb2RlPgp2YXIgRmlsZSA9IEphdmEudHlwZSgiamF2YS5pby5GaWxlIik7CnZhciBsaXN0Q3VyRGlyID0gbmV3IEZpbGUoIi4iKS5saXN0RmlsZXMoKTsKdmFyIGpzTGlzdCA9IEphdmEuZnJvbShsaXN0Q3VyRGlyKTsKcHJpbnQoanNMaXN0KTsKPC9jb2RlPjwvcHJlPgo8aHI+CjxhIG5hbWU9ImpzaW1wbGVtZW50IiBpZD0ianNpbXBsZW1lbnQiPjwvYT4KPGgzPkltcGxlbWVudGluZyBKYXZhIGludGVyZmFjZXM8L2gzPgo8cD5BIEphdmEgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBKYXZhU2NyaXB0IGJ5IHVzaW5nIGEKSmF2YSBhbm9ueW1vdXMgY2xhc3MtbGlrZSBzeW50YXg6PC9wPgo8cHJlPjxjb2RlPgovLyA8YSBocmVmPSJzb3VyY2UvcnVubmFibGUuanMiPnJ1bm5hYmxlLmpzPC9hPgoKdmFyIHIgID0gbmV3IGphdmEubGFuZy5SdW5uYWJsZSgpIHsKICAgIHJ1bjogZnVuY3Rpb24oKSB7CiAgICAgICAgcHJpbnQoInJ1bm5pbmcuLi5cbiIpOwogICAgfQp9OwoKLy8gInIiIGNhbiBiZSBwYXNzZWQgdG8gSmF2YSBtZXRob2RzIHRoYXQgZXhwZWN0IGphdmEubGFuZy5SdW5uYWJsZQp2YXIgdGggPSBuZXcgamF2YS5sYW5nLlRocmVhZChyKTsKdGguc3RhcnQoKTsKdGguam9pbigpOwo8L2NvZGU+CjwvcHJlPgo8cD5XaGVuIGFuIGludGVyZmFjZSB3aXRoIGEgc2luZ2xlIG1ldGhvZCBpcyBleHBlY3RlZCwgeW91IGNhbiBwYXNzCmEgc2NyaXB0IGZ1bmN0aW9uIGRpcmVjdGx5LihhdXRvIGNvbnZlcnNpb24pPC9wPgo8cHJlPjxjb2RlPgovLyA8YSBocmVmPSJzb3VyY2Uvc2FtZnVuYy5qcyI+c2FtZnVuYy5qczwvYT4KCmZ1bmN0aW9uIGZ1bmMoKSB7CiAgICAgcHJpbnQoIkkgYW0gZnVuYyEiKTsKfQoKLy8gcGFzcyBzY3JpcHQgZnVuY3Rpb24gZm9yIGphdmEubGFuZy5SdW5uYWJsZSBhcmd1bWVudAp2YXIgdGggPSBuZXcgamF2YS5sYW5nLlRocmVhZChmdW5jKTsKdGguc3RhcnQoKTsKdGguam9pbigpOwo8L2NvZGU+CjwvcHJlPgo8aHI+CjxhIG5hbWU9ImpzZXh0ZW5kYWJzdHJhY3QiIGlkPSJqc2V4dGVuZGFic3RyYWN0Ij48L2E+CjxoMz5FeHRlbmRpbmcgQWJzdHJhY3QgSmF2YSBDbGFzc2VzPC9oMz4KPHA+CklmIGEgSmF2YSBjbGFzcyBpcyBhYnN0cmFjdCwgeW91IGNhbiBpbnN0YW50aWF0ZSBhbiBhbm9ueW1vdXMgc3ViY2xhc3Mgb2YgaXQgdXNpbmcgYW4gYXJndW1lbnQgbGlzdCB0aGF0IGlzIGFwcGxpY2FibGUgdG8gYW55IG9mIGl0cyBwdWJsaWMgb3IgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycywgYnV0IGluc2VydGluZyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggZnVuY3Rpb25zIHByb3BlcnRpZXMgdGhhdCBwcm92aWRlIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBhYnN0cmFjdCBtZXRob2RzLiBJZiBtZXRob2QgbmFtZXMgYXJlIG92ZXJsb2FkZWQsIHRoZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIG92ZXJsb2Fkcy4gRS5nLjoKPC9wPgoKPHByZT48Y29kZT4KIHZhciBUaW1lclRhc2sgPSAgSmF2YS50eXBlKCJqYXZhLnV0aWwuVGltZXJUYXNrIikKIHZhciB0YXNrID0gbmV3IFRpbWVyVGFzayh7IHJ1bjogZnVuY3Rpb24oKSB7IHByaW50KCJIZWxsbyBXb3JsZCEiKSB9IH0pCjwvY29kZT48L3ByZT4KCk5hc2hvcm4gc3VwcG9ydHMgYSBzeW50YWN0aWMgZXh0ZW5zaW9uIHdoZXJlIGEgIm5ldyIgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhbiBhcmd1bWVudCBpcyBpZGVudGljYWwgdG8gaW52b2tpbmcgdGhlIGNvbnN0cnVjdG9yIGFuZCBwYXNzaW5nIHRoZSBhcmd1bWVudCB0byBpdCwgc28geW91IGNhbiB3cml0ZSB0aGUgYWJvdmUgZXhhbXBsZSBhbHNvIGFzOgoKPHByZT48Y29kZT4KIHZhciB0YXNrID0gbmV3IFRpbWVyVGFzayB7CiAgICAgcnVuOiBmdW5jdGlvbigpIHsKICAgICAgIHByaW50KCJIZWxsbyBXb3JsZCEiKQogICAgIH0KIH0KPC9jb2RlPjwvcHJlPgoKd2hpY2ggaXMgdmVyeSBzaW1pbGFyIHRvIEphdmEgYW5vbnltb3VzIGlubmVyIGNsYXNzIGRlZmluaXRpb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgdHlwZSBpcyBhbiBhYnN0cmFjdCB0eXBlIHdpdGggYSBzaW5nbGUgYWJzdHJhY3QgbWV0aG9kIChjb21tb25seSByZWZlcnJlZCB0byBhcyBhICJTQU0gdHlwZSIpIG9yIGFsbCBhYnN0cmFjdCBtZXRob2RzIGl0IGhhcyBzaGFyZSB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUpLCB0aGVuIGluc3RlYWQgb2YgYW4gb2JqZWN0LCB5b3UgY2FuIGp1c3QgcGFzcyBhIGZ1bmN0aW9uLCBzbyB0aGUgYWJvdmUgZXhhbXBsZSBjYW4gYmVjb21lIGV2ZW4gbW9yZSBzaW1wbGlmaWVkIHRvOgoKPHByZT48Y29kZT4KIHZhciB0YXNrID0gbmV3IFRpbWVyVGFzayhmdW5jdGlvbigpIHsgcHJpbnQoIkhlbGxvIFdvcmxkISIpIH0pCjwvY29kZT48L3ByZT4KCjxwPgpOb3RlIHRoYXQgaW4gZXZlcnkgb25lIG9mIHRoZXNlIGNhc2VzIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgaGFzIGNvbnN0cnVjdG9ycyB0aGF0IHRha2Ugc29tZSBhcmd1bWVudHMsIHlvdSBjYW4gaW52b2tlIHRob3NlIHNpbXBseSBieSBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2JqZWN0IG9yIGZ1bmN0aW9uLgo8L3A+CjxwPgpUaGUgdXNlIG9mIGZ1bmN0aW9ucyBjYW4gYmUgdGFrZW4gZXZlbiBmdXJ0aGVyOyBpZiB5b3UgYXJlIGludm9raW5nIGEgSmF2YSBtZXRob2QgdGhhdCB0YWtlcyBhIFNBTSB0eXBlLCB5b3UgY2FuIGp1c3QgcGFzcyBpbiBhIGZ1bmN0aW9uIG9iamVjdCwgYW5kIE5hc2hvcm4gd2lsbCBrbm93IHdoYXQgeW91IG1lYW50Ogo8L3A+Cjxjb2RlPjxwcmU+CiBKYXZhLnR5cGUoImphdmEudXRpbC5UaW1lciIpCiB0aW1lci5zY2hlZHVsZShmdW5jdGlvbigpIHsgcHJpbnQoIkhlbGxvIFdvcmxkISIpIH0pCjwvY29kZT48L3ByZT4KCkhlcmUsIDxjb2RlPlRpbWVyLnNjaGVkdWxlKCk8L2NvZGU+IGV4cGVjdHMgYSA8Y29kZT5UaW1lclRhc2s8L2NvZGU+IGFzIGl0cyBhcmd1bWVudCwgc28gTmFzaG9ybiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgVGltZXJUYXNrIHN1YmNsYXNzIGFuZCB1c2VzIHRoZSBwYXNzZWQgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGl0cyBvbmx5IGFic3RyYWN0IG1ldGhvZCwgcnVuKCkuIEluIHRoaXMgdXNhZ2UgdGhvdWdoLCB5b3UgY2FuJ3QgdXNlIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9yczsgdGhlIHR5cGUgbXVzdCBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlLCBvciBtdXN0IGhhdmUgYSBwcm90ZWN0ZWQgb3IgcHVibGljIG5vLWFyZyBjb25zdHJ1Y3Rvci4KCjxocj4KPGEgbmFtZT0ianNleHRlbmRjb25jcmV0ZSIgaWQ9ImpzZXh0ZW5kY29uY3JldGUiPjwvYT4KPGgzPkV4dGVuZGluZyBDb25jcmV0ZSBKYXZhIENsYXNzZXM8L2gzPgo8cD4KVG8gZXh0ZW5kIGEgY29uY3JldGUgSmF2YSBjbGFzcywgeW91IGhhdmUgdG8gdXNlIDxjb2RlPkphdmEuZXh0ZW5kPC9jb2RlPiBmdW5jdGlvbi4KPGNvZGU+SmF2YS5leHRlbmQ8L2NvZGU+IHJldHVybnMgYSB0eXBlIG9iamVjdCBmb3IgYSBzdWJjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIEphdmEgY2xhc3MgKG9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlKSB0aGF0IGFjdHMgYXMgYSBzY3JpcHQtdG8tSmF2YSBhZGFwdGVyIGZvciBpdC4gIAo8L3A+CjxwcmU+PGNvZGU+Ci8vIDxhIGhyZWY9InNvdXJjZS9qYXZhZXh0ZW5kLmpzIj5qYXZhZXh0ZW5kLmpzPC9hPgoKdmFyIEFycmF5TGlzdCA9IEphdmEudHlwZSgiamF2YS51dGlsLkFycmF5TGlzdCIpCnZhciBBcnJheUxpc3RFeHRlbmRlciA9IEphdmEuZXh0ZW5kKEFycmF5TGlzdCkKdmFyIHByaW50U2l6ZUludm9rZWRBcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0RXh0ZW5kZXIoKSB7CiAgICBzaXplOiBmdW5jdGlvbigpIHsgcHJpbnQoInNpemUgaW52b2tlZCEiKTsgfQp9CnZhciBwcmludEFkZEludm9rZWRBcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0RXh0ZW5kZXIoKSB7CiAgICBhZGQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBpZih0eXBlb2YoeSkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHByaW50KCJhZGQoZSkgaW52b2tlZCEiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCgiYWRkKGksIGUpIGludm9rZWQhIik7CiAgICAgICAgfQogICAgfQp9OwpwcmludFNpemVJbnZva2VkQXJyYXlMaXN0LnNpemUoKTsKcHJpbnRBZGRJbnZva2VkQXJyYXlMaXN0LmFkZCgzMywgMzMpOwo8L2NvZGU+PC9wcmU+CjxwPgpUaGUgcmVhc29uIHlvdSBtdXN0IHVzZSA8Y29kZT5KYXZhLmV4dGVuZCgpPC9jb2RlPiB3aXRoIGNvbmNyZXRlIGNsYXNzZXMgaXMgdGhhdCB3aXRoIGNvbmNyZXRlIGNsYXNzZXMsIHRoZXJlIGNhbiBiZSBhIApzeW50YWN0aWMgYW1iaWd1aXR5IGlmIHlvdSBqdXN0IGludm9rZSB0aGVpciBjb25zdHJ1Y3Rvci4gQ29uc2lkZXIgdGhpcyBleGFtcGxlOgo8L3A+CjxwcmU+PGNvZGU+CnZhciB0ID0gbmV3IGphdmEubGFuZy5UaHJlYWQoeyBydW46IGZ1bmN0aW9uKCkgeyBwcmludCgiSGVsbG8hIikgfSB9KQo8L2NvZGU+PC9wcmU+CjxwPgpJZiB3ZSBhbGxvd2VkIHN1YmNsYXNzaW5nIG9mIGNvbmNyZXRlIGNsYXNzZXMgd2l0aCBjb25zdHJ1Y3RvciBzeW50YXgsIE5hc2hvcm4gY291bGRuJ3QgdGVsbCBpZiB5b3UncmUgY3JlYXRpbmcgYSBuZXcgCjxjb2RlPlRocmVhZDwvY29kZT4gYW5kIHBhc3NpbmcgaXQgYSA8Y29kZT5SdW5uYWJsZTwvY29kZT4gYXQgdGhpcyBwb2ludCwgb3IgeW91IGFyZSBzdWJjbGFzc2luZyA8Y29kZT5UaHJlYWQ8L2NvZGU+IGFuZApwYXNzaW5nIGl0IGEgbmV3IGltcGxlbWVudGF0aW9uIGZvciBpdHMgb3duIDxjb2RlPnJ1bigpPC9jb2RlPiBtZXRob2QuCjwvcD4KPGhyPgo8YSBuYW1lPSJqc2ltcGxlbWVudG11bHRpcGxlIiBpZD0ianNpbXBsZW1lbnRtdWx0aXBsZSI+PC9hPgo8aDM+SW1wbGVtZW50aW5nIE11bHRpcGxlIEludGVyZmFjZXM8L2gzPgo8cD4KPGNvZGU+SmF2YS5leHRlbmQ8L2NvZGU+IGNhbiBpbiBmYWN0IHRha2UgYSBsaXN0IG9mIG11bHRpcGxlIHR5cGVzLiBBdCBtb3N0IG9uZSBvZiB0aGUgdHlwZXMgY2FuIGJlIGEgY2xhc3MsIGFuZCB0aGUgcmVzdCBtdXN0CmJlIGludGVyZmFjZXMgKHRoZSBjbGFzcyBkb2Vzbid0IGhhdmUgdG8gYmUgdGhlIGZpcnN0IGluIHRoZSBsaXN0KS4gWW91IHdpbGwgZ2V0IGJhY2sgYW4gb2JqZWN0IHRoYXQgZXh0ZW5kcyB0aGUgY2xhc3MgYW5kIAppbXBsZW1lbnRzIGFsbCB0aGUgaW50ZXJmYWNlcy4gKE9idmlvdXNseSwgaWYgeW91IG9ubHkgc3BlY2lmeSBpbnRlcmZhY2VzIGFuZCBubyBjbGFzcywgdGhlIG9iamVjdCB3aWxsIGV4dGVuZCA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPikuCjxocj4KPGEgbmFtZT0iY2xhc3NCb3VuZEltcGxlbWVudGF0aW9ucyIgaWQ9ImNsYXNzQm91bmRJbXBsZW1lbnRhdGlvbnMiPjwvYT4KPGgzPkNsYXNzLUJvdW5kIEltcGxlbWVudGF0aW9uczwvaDM+CjxwPgpUaGUgbWV0aG9kcyBzaG93biBzbyBmYXIgZm9yIGV4dGVuZGluZyBKYXZhIGNsYXNzZXMgYW5kIGltcGxlbWVudGluZyBpbnRlcmZhY2VzICZuZGFzaDsgcGFzc2luZyBhbiBpbXBsZW1lbnRhdGlvbiBKYXZhU2NyaXB0IG9iamVjdCAKb3IgZnVuY3Rpb24gdG8gYSBjb25zdHJ1Y3Rvciwgb3IgdXNpbmcgPGNvZGU+SmF2YS5leHRlbmQ8L2NvZGU+IHdpdGggPGNvZGU+bmV3PC9jb2RlPiAmbmRhc2g7IGFsbCBwcm9kdWNlIGNsYXNzZXMgdGhhdCB0YWtlIGFuCmV4dHJhIEphdmFTY3JpcHQgb2JqZWN0IHBhcmFtZXRlciBpbiB0aGVpciBjb25zdHJ1Y3RvcnMgdGhhdCBzcGVjaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgdGhlcmVmb3JlIGFsd2F5cyBib3VuZAp0byB0aGUgYWN0dWFsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgd2l0aCA8Y29kZT5uZXc8L2NvZGU+LCBhbmQgbm90IHRvIHRoZSB3aG9sZSBjbGFzcy4gVGhpcyBoYXMgc29tZSBhZHZhbnRhZ2VzLCBmb3IgZXhhbXBsZSBpbiB0aGUKbWVtb3J5IGZvb3RwcmludCBvZiB0aGUgcnVudGltZSwgYXMgTmFzaG9ybiBjYW4ganVzdCBjcmVhdGUgYSBzaW5nbGUgInVuaXZlcnNhbCBhZGFwdGVyIiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2YgdHlwZXMgYmVpbmcgaW1wbGVtZW50ZWQuCkluIHJlYWxpdHksIHRoZSBiZWxvdyBjb2RlIHNob3dzIHRoYXQgZGlmZmVyZW50IGluc3RhbnRpYXRpb25zIG9mLCBzYXksIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiBoYXZlIHRoZSBzYW1lIGNsYXNzIHJlZ2FyZGxlc3Mgb2YgdGhlbSBoYXZpbmcKZGlmZmVyZW50IEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2JqZWN0czoKPC9wPgo8cHJlPjxjb2RlPgp2YXIgUnVubmFibGUgPSBqYXZhLmxhbmcuUnVubmFibGU7CnZhciByMSA9IG5ldyBSdW5uYWJsZShmdW5jdGlvbigpIHsgcHJpbnQoIkknbSBydW5uYWJsZSAxISIpIH0pCnZhciByMiA9IG5ldyBSdW5uYWJsZShmdW5jdGlvbigpIHsgcHJpbnQoIkknbSBydW5uYWJsZSAyISIpIH0pCnIxLnJ1bigpCnIyLnJ1bigpCnByaW50KCJXZSBzaGFyZSB0aGUgc2FtZSBjbGFzczogIiArIChyMS5jbGFzcyA9PT0gcjIuY2xhc3MpKQo8L2NvZGU+PC9wcmU+CjxwPgpwcmludHM6CjwvcD4KPHByZT48Y29kZT4KSSdtIHJ1bm5hYmxlIDEhCkknbSBydW5uYWJsZSAyIQpXZSBzaGFyZSB0aGUgc2FtZSBjbGFzczogdHJ1ZQo8L2NvZGU+PC9wcmU+CjxwPgpTb21ldGltZXMsIGhvd2V2ZXIsIHlvdSdsbCB3YW50IHRvIGV4dGVuZCBhIEphdmEgY2xhc3Mgb3IgaW1wbGVtZW50IGFuIGludGVyZmFjZSB3aXRoIGltcGxlbWVudGF0aW9uIGJvdW5kIHRvIHRoZSBjbGFzcywgbm90IHRvCml0cyBpbnN0YW5jZXMuIFN1Y2ggYSBuZWVkIGFyaXNlcywgZm9yIGV4YW1wbGUsIHdoZW4geW91IG5lZWQgdG8gcGFzcyB0aGUgY2xhc3MgZm9yIGluc3RhbnRpYXRpb24gdG8gYW4gZXh0ZXJuYWwgQVBJOyBwcmltZSBleGFtcGxlCm9mIHRoaXMgaXMgdGhlIEphdmFGWCBmcmFtZXdvcmsgd2hlcmUgeW91IG5lZWQgdG8gcGFzcyBhbiBBcHBsaWNhdGlvbiBjbGFzcyB0byB0aGUgRlggQVBJIGFuZCBsZXQgaXQgaW5zdGFudGlhdGUgaXQuCjwvcD4KPHA+CkZvcnR1bmF0ZWx5LCB0aGVyZSdzIGEgc29sdXRpb24gZm9yIHRoYXQ6IDxjb2RlPkphdmEuZXh0ZW5kKCk8L2NvZGU+ICZuZGFzaDsgYXNpZGUgZnJvbSBiZWluZyBhYmxlIHRvIHRha2UgYW55IG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMKZGVub3RpbmcgYSBjbGFzcyB0byBleHRlbmQgYW5kIGludGVyZmFjZXMgdG8gaW1wbGVtZW50ICZuZGFzaDsgY2FuIGFsc28gdGFrZSBvbmUgbGFzdCBhcmd1bWVudCB0aGF0IGhhcyB0byBiZSBhIEphdmFTY3JpcHQgb2JqZWN0CnRoYXQgc2VydmVzIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG1ldGhvZHMuIEluIHRoaXMgY2FzZSwgPGNvZGU+SmF2YS5leHRlbmQoKTwvY29kZT4gd2lsbCBjcmVhdGUgYSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZQpjb25zdHJ1Y3RvcnMgYXMgdGhlIG9yaWdpbmFsIGNsYXNzIGhhZCwgYXMgdGhleSBkb24ndCBuZWVkIHRvIHRha2UgYW4gYW4gZXh0cmEgaW1wbGVtZW50YXRpb24gb2JqZWN0IHBhcmFtZXRlci4gVGhlIGV4YW1wbGUgYmVsb3cKc2hvd3MgaG93IHlvdSBjYW4gY3JlYXRlIGNsYXNzLWJvdW5kIGltcGxlbWVudGF0aW9ucywgYW5kIHNob3dzIHRoYXQgaW4gdGhpcyBjYXNlLCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgZGlmZmVyZW50IGludm9jYXRpb25zCmFyZSBpbmRlZWQgZGlmZmVyZW50Ogo8L3A+CjxwcmU+PGNvZGU+CnZhciBSdW5uYWJsZUltcGwxID0gSmF2YS5leHRlbmQoamF2YS5sYW5nLlJ1bm5hYmxlLCBmdW5jdGlvbigpIHsgcHJpbnQoIkknbSBydW5uYWJsZSAxISIpIH0pCnZhciBSdW5uYWJsZUltcGwyID0gSmF2YS5leHRlbmQoamF2YS5sYW5nLlJ1bm5hYmxlLCBmdW5jdGlvbigpIHsgcHJpbnQoIkknbSBydW5uYWJsZSAyISIpIH0pCnZhciByMSA9IG5ldyBSdW5uYWJsZUltcGwxKCkKdmFyIHIyID0gbmV3IFJ1bm5hYmxlSW1wbDIoKQpyMS5ydW4oKQpyMi5ydW4oKQpwcmludCgiV2Ugc2hhcmUgdGhlIHNhbWUgY2xhc3M6ICIgKyAocjEuY2xhc3MgPT09IHIyLmNsYXNzKSkKPC9jb2RlPjwvcHJlPgo8cD4KcHJpbnRzOgo8L3A+CjxwcmU+PGNvZGU+CkknbSBydW5uYWJsZSAxIQpJJ20gcnVubmFibGUgMiEKV2Ugc2hhcmUgdGhlIHNhbWUgY2xhc3M6IGZhbHNlCjwvY29kZT48L3ByZT4KPHA+CkFzIHlvdSBjYW4gc2VlLCB0aGUgbWFqb3IgZGlmZmVyZW5jZSBoZXJlIGlzIHRoYXQgd2UgbW92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdCBpbnRvIHRoZSBpbnZvY2F0aW9uIG9mIDxjb2RlPkphdmEuZXh0ZW5kPC9jb2RlPgpmcm9tIHRoZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucyAmbmRhc2g7IGluZGVlZCB0aGUgY29uc3RydWN0b3IgaW52b2NhdGlvbnMgbm93IGRvbid0IGV2ZW4gbmVlZCB0byB0YWtlIGFuIGV4dHJhIHBhcmFtZXRlciEgU2luY2UKdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgYm91bmQgdG8gYSBjbGFzcywgdGhlIHR3byBjbGFzc2VzIG9idmlvdXNseSBjYW4ndCBiZSB0aGUgc2FtZSwgYW5kIHdlIGluZGVlZCBzZWUgdGhhdCB0aGUgdHdvIHJ1bm5hYmxlcyBubwpsb25nZXIgc2hhcmUgdGhlIHNhbWUgY2xhc3MgJm5kYXNoOyBldmVyeSBpbnZvY2F0aW9uIG9mIDxjb2RlPkphdmEuZXh0ZW5kKCk8L2NvZGU+IHdpdGggYSBjbGFzcy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvYmplY3QgdHJpZ2dlcnMKdGhlIGNyZWF0aW9uIG9mIGEgbmV3IEphdmEgYWRhcHRlciBjbGFzcy4KPC9wPgo8cD4KRmluYWxseSwgdGhlIGFkYXB0ZXIgY2xhc3NlcyB3aXRoIGNsYXNzLWJvdW5kIGltcGxlbWVudGF0aW9ucyBjYW4gPGk+c3RpbGw8L2k+IHRha2UgYW4gYWRkaXRpb25hbCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdG8gZnVydGhlcgpvdmVycmlkZSB0aGUgYmVoYXZpb3Igb24gYSBwZXItaW5zdGFuY2UgYmFzaXMuIFRodXMsIHlvdSBjYW4gZXZlbiBjb21iaW5lIHRoZSB0d28gYXBwcm9hY2hlczogeW91IGNhbiBwcm92aWRlIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCmluIGEgY2xhc3MtYmFzZWQgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvYmplY3QgcGFzc2VkIHRvIDxjb2RlPkphdmEuZXh0ZW5kPC9jb2RlPiwgYW5kIHBhcnQgaW4gYW5vdGhlciBvYmplY3QgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KV2hhdGV2ZXIgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBieSB0aGUgY29uc3RydWN0b3ItcGFzc2VkIG9iamVjdCB3aWxsIG92ZXJyaWRlIHRoZSBmdW5jdGlvbnMgaW4gdGhlIGNsYXNzLWJvdW5kIG9iamVjdC4KPC9wPgo8cHJlPjxjb2RlPgp2YXIgUnVubmFibGVJbXBsID0gSmF2YS5leHRlbmQoamF2YS5sYW5nLlJ1bm5hYmxlLCBmdW5jdGlvbigpIHsgcHJpbnQoIkknbSBydW5uYWJsZSAxISIpIH0pCnZhciByMSA9IG5ldyBSdW5uYWJsZUltcGwoKQp2YXIgcjIgPSBuZXcgUnVubmFibGVJbXBsKGZ1bmN0aW9uKCkgeyBwcmludCgiSSdtIHJ1bm5hYmxlIDIhIikgfSkKcjEucnVuKCkKcjIucnVuKCkKcHJpbnQoIldlIHNoYXJlIHRoZSBzYW1lIGNsYXNzOiAiICsgKHIxLmNsYXNzID09PSByMi5jbGFzcykpCjwvY29kZT48L3ByZT4KPHA+CnByaW50czoKPC9wPgo8cHJlPjxjb2RlPgpJJ20gcnVubmFibGUgMSEKSSdtIHJ1bm5hYmxlIDIhCldlIHNoYXJlIHRoZSBzYW1lIGNsYXNzOiB0cnVlCjwvY29kZT48L3ByZT4KPGhyPgo8YSBuYW1lPSJqc292ZXJsb2FkIiBpZD0ianNvdmVybG9hZCI+PC9hPgo8aDM+T3ZlcmxvYWQgUmVzb2x1dGlvbjwvaDM+CjxwPkphdmEgbWV0aG9kcyBjYW4gYmUgb3ZlcmxvYWRlZCBieSBhcmd1bWVudCB0eXBlcy4gSW4gSmF2YSwKb3ZlcmxvYWQgcmVzb2x1dGlvbiBvY2N1cnMgYXQgY29tcGlsZSB0aW1lIChwZXJmb3JtZWQgYnkgamF2YWMpLgpXaGVuIGNhbGxpbmcgSmF2YSBtZXRob2RzIGZyb20gTmFzaG9ybiwgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCB3aWxsIGJlCnNlbGVjdGVkIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcyBhdCBpbnZvY2F0aW9uIHRpbWUuIFlvdSBkbyBub3QgbmVlZAp0byBkbyBhbnl0aGluZyBzcGVjaWFsICZuZGFzaDsgdGhlIGNvcnJlY3QgSmF2YSBtZXRob2Qgb3ZlcmxvYWQgdmFyaWFudCAKaXMgc2VsZWN0ZWQgYmFzZWQgYXV0b21hdGljYWxseS4gWW91IHN0aWxsIGhhdmUgdGhlIG9wdGlvbiBvZiBleHBsaWNpdGx5CnNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIG92ZXJsb2FkIHZhcmlhbnQuIFJlYXNvbnMgZm9yIHRoaXMgaW5jbHVkZSAKZWl0aGVyIHJ1bm5pbmcgaW50byBhIGdlbnVpbmUgYW1iaWd1aXR5IHdpdGggYWN0dWFsIGFyZ3VtZW50IHR5cGVzLCBvciAKcmFyZWx5IHJlYXNvbnMgb2YgcGVyZm9ybWFuY2UgJm5kYXNoOyBpZiB5b3Ugc3BlY2lmeSB0aGUgYWN0dWFsIG92ZXJsb2FkCnRoZW4gdGhlIGVuZ2luZSBkb2Vzbid0IGhhdmUgdG8gcGVyZm9ybSByZXNvbHV0aW9uIGR1cmluZyBpbnZvY2F0aW9uLgpJbmRpdmlkdWFsIG92ZXJsb2FkcyBvZiBhIEphdmEgbWV0aG9kcyBhcmUgZXhwb3NlZCBhcyBzcGVjaWFsIHByb3BlcnRpZXMKd2l0aCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGZvbGxvd2VkIHdpdGggaXRzIHNpZ25hdHVyZSBpbiBwYXJlbnRoZXNlcy4gCllvdSBjYW4gaW52b2tlIHRoZW0gbGlrZSB0aGlzOjwvcD4KPHByZT48Y29kZT4KLy8gPGEgaHJlZj0ic291cmNlL292ZXJsb2FkLmpzIj5vdmVybG9hZC5qczwvYT4KCnZhciBvdXQgPSBqYXZhLmxhbmcuU3lzdGVtLm91dDsKCi8vIHNlbGVjdCBhIHBhcnRpY3VsYXIgcHJpbnQgZnVuY3Rpb24gCm91dFsicHJpbnRsbihPYmplY3QpIl0oImhlbGxvIik7CjwvY29kZT4KPC9wcmU+CjxwPgpOb3RlIHRoYXQgeW91IG5vcm1hbGx5IGRvbid0IGV2ZW4gaGF2ZSB0byB1c2UgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIGluIAp0aGUgc2lnbmF0dXJlcyBhcyBsb25nIGFzIHRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIGlzIHN1ZmZpY2llbnQKZm9yIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBzaWduYXR1cmUuIEluIHByYWN0aWNlIHRoaXMgbWVhbnMgdGhhdCBvbmx5CmluIHRoZSBleHRyZW1lbHkgdW5saWtlbHkgY2FzZSB0aGF0IHR3byBvdmVybG9hZHMgb25seSBkaWZmZXIgaW4gCnBhcmFtZXRlciB0eXBlcyB0aGF0IGhhdmUgaWRlbnRpY2FsIHVucXVhbGlmaWVkIG5hbWVzIGJ1dCBjb21lIGZyb20gCmRpZmZlcmVudCBwYWNrYWdlcyB3b3VsZCB5b3UgbmVlZCB0byB1c2UgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQpjbGFzcy4KPC9wPgo8aHI+CjxhIG5hbWU9ImRhdGFUeXBlTWFwcGluZyIgaWQ9ImRhdGFUeXBlTWFwcGluZyI+PC9hPgo8aDM+TWFwcGluZyBvZiBEYXRhIFR5cGVzIEJldHdlZW4gSmF2YSBhbmQgSmF2YVNjcmlwdDwvaDM+CjxwPgpXZSBoYXZlIHByZXZpb3VzbHkgc2hvd24gc29tZSBvZiB0aGUgZGF0YSB0eXBlIG1hcHBpbmdzIGJldHdlZW4gSmF2YSBhbmQgSmF2YVNjcmlwdC4KV2Ugc2F3IHRoYXQgYXJyYXlzIG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQuIFdlIGhhdmUgYWxzbyBzaG93biB0aGF0IEphdmFTY3JpcHQgZnVuY3Rpb25zCmFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBTQU0gdHlwZXMgd2hlbiBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byBKYXZhIG1ldGhvZHMuIE1vc3Qgb3RoZXIKY29udmVyc2lvbnMgd29yayBhcyB5b3Ugd291bGQgZXhwZWN0Lgo8L3A+CjxwPgpFdmVyeSBKYXZhU2NyaXB0IG9iamVjdCBpcyBhbHNvIGEgPGNvZGU+amF2YS51dGlsLk1hcDwvY29kZT4gc28gQVBJcyByZWNlaXZpbmcgbWFwcyB3aWxsIHJlY2VpdmUgdGhlbSBkaXJlY3RseS4KPC9wPgo8cD4KV2hlbiBudW1iZXJzIGFyZSBwYXNzZWQgdG8gYSBKYXZhIEFQSSwgdGhleSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZXhwZWN0ZWQgdGFyZ2V0IG51bWVyaWMgdHlwZSwgZWl0aGVyIGJveGVkIG9yCnByaW1pdGl2ZSwgYnV0IGlmIHRoZSB0YXJnZXQgdHlwZSBpcyBsZXNzIHNwZWNpZmljLCBzYXkgPGNvZGU+TnVtYmVyPC9jb2RlPiBvciA8Y29kZT5PYmplY3Q8L2NvZGU+LCB5b3UgY2FuIG9ubHkKY291bnQgb24gdGhlbSBiZWluZyBhIDxjb2RlPk51bWJlcjwvY29kZT4sIGFuZCBoYXZlIHRvIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciB3aGV0aGVyIGl0J3MgYSBib3hlZCA8Y29kZT5Eb3VibGU8L2NvZGU+LAo8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+TG9uZzwvY29kZT4sIGV0Yy4gJm5kYXNoOyBpdCBjYW4gYmUgYW55IG9mIHRoZXNlIGR1ZSB0byBpbnRlcm5hbCBvcHRpbWl6YXRpb25zLiBBbHNvLCB5b3UgCmNhbiBwYXNzIGFueSBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgSmF2YSBBUEkgZXhwZWN0aW5nIGVpdGhlciBhIGJveGVkIG9yIHByaW1pdGl2ZSBudW1iZXI7IHRoZSBKYXZhU2NyaXB0IHNwZWNpZmljYXRpb24ncwo8Y29kZT5Ub051bWJlcjwvY29kZT4gY29udmVyc2lvbiBhbGdvcml0aG0gd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSB2YWx1ZS4KPC9wPgo8cD4KSW4gYSBzaW1pbGFyIHZlaW4sIGlmIGEgSmF2YSBtZXRob2QgZXhwZWN0cyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb3IgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiwgdGhlIHZhbHVlcyB3aWxsIGJlCmNvbnZlcnRlZCB1c2luZyBhbGwgY29udmVyc2lvbnMgYWxsb3dlZCBieSB0aGUgSmF2YVNjcmlwdCBzcGVjaWZpY2F0aW9uJ3MgPGNvZGU+VG9TdHJpbmc8L2NvZGU+IGFuZCA8Y29kZT5Ub0Jvb2xlYW48L2NvZGU+CmNvbnZlcnNpb25zLgo8L3A+CjxwPgpGaW5hbGx5LCBhIHdvcmQgb2YgY2F1dGlvbiBhYm91dCBzdHJpbmdzLiBEdWUgdG8gaW50ZXJuYWwgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBvZiBzdHJpbmcgb3BlcmF0aW9ucywgSmF2YVNjcmlwdCBzdHJpbmdzIGFyZQpub3QgYWx3YXlzIG5lY2Vzc2FyaWx5IG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4sIGJ1dCB0aGV5IHdpbGwgYWx3YXlzIGJlIG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLkNoYXJTZXF1ZW5jZTwvY29kZT4uCklmIHlvdSBwYXNzIHRoZW0gdG8gYSBKYXZhIG1ldGhvZCB0aGF0IGV4cGVjdHMgYSA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPiBwYXJhbWV0ZXIsIHRoZW4geW91IHdpbGwgbmF0dXJhbGx5IHJlY2VpdmUgYSBKYXZhClN0cmluZywgYnV0IGlmIHRoZSBzaWduYXR1cmUgb2YgeW91ciBtZXRob2QgaXMgbW9yZSBnZW5lcmljLCBpLmUuIGl0IHJlY2VpdmVzIGEgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gcGFyYW1ldGVyLCB5b3UgY2FuIAplbmQgdXAgd2l0aCBhbiBvYmplY3Qgb2YgcHJpdmF0ZSBlbmdpbmUgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gYnV0IGlzIG5vdCBhIEphdmEgU3RyaW5nLgo8L3A+Cjxocj4KPGEgbmFtZT0iZW5naW5laW1wbCIgaWQ9ImVuZ2luZWltcGwiPjwvYT4KPGgyPkltcGxlbWVudGluZyBZb3VyIE93biBTY3JpcHQgRW5naW5lPC9oMj4KPHA+V2Ugd2lsbCBub3QgY292ZXIgaW1wbGVtZW50YXRpb24gb2YgSlNSLTIyMyBjb21wbGlhbnQgc2NyaXB0CmVuZ2luZXMgaW4gZGV0YWlsLiBNaW5pbWFsbHksIHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGUKPGNvZGU+amF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZTwvY29kZT4gYW5kCjxjb2RlPmphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5PC9jb2RlPiBpbnRlcmZhY2VzLiBUaGUKYWJzdHJhY3QgY2xhc3MgPGNvZGU+amF2YXguc2NyaXB0LkFic3RyYWN0U2NyaXB0RW5naW5lPC9jb2RlPgpwcm92aWRlcyB1c2VmdWwgZGVmYXVsdHMgZm9yIGEgZmV3IG1ldGhvZHMgb2YgdGhlCjxjb2RlPlNjcmlwdEVuZ2luZTwvY29kZT4gaW50ZXJmYWNlLjwvcD4KPHA+QmVmb3JlIHN0YXJ0aW5nIHRvIGltcGxlbWVudCBhIEpTUi0yMjMgZW5naW5lLCB5b3UgbWF5IHdhbnQgdG8KY2hlY2sgPGEgaHJlZj0iaHR0cDovL2phdmEubmV0L3Byb2plY3RzL1NjcmlwdGluZyI+aHR0cDovL2phdmEubmV0L3Byb2plY3RzL1NjcmlwdGluZzwvYT4KcHJvamVjdC4gVGhpcyBwcm9qZWN0IG1haW50YWlucyBKU1ItMjIzIGltcGxlbWVudGF0aW9ucyBmb3IgbWFueQpwb3B1bGFyIG9wZW4gc291cmNlIHNjcmlwdGluZyBsYW5ndWFnZXMuPC9wPgo8aHI+CjxhIG5hbWU9InJlZnMiIGlkPSJyZWZzIj48L2E+CjxoMj5SZWZlcmVuY2VzPC9oMj4KPHVsPgo8bGk+PGEgaHJlZj0iaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjMiPkpTUi0yMjMgU2NyaXB0aW5nCmZvciB0aGUgSmF2YSBQbGF0Zm9ybTwvYT48L2xpPgo8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEubmV0L3Byb2plY3RzL1NjcmlwdGluZyI+aHR0cDovL2phdmEubmV0L3Byb2plY3RzL1NjcmlwdGluZwo8L2E+PC9saT4KPC91bD4KCgoKPGRpdiBjbGFzcz0iaHIiPjxocj48L2Rpdj4KPHRhYmxlIHN1bW1hcnk9ImxheW91dCIgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+Cjx0Ym9keT48dHIgdmFsaWduPSJUT1AiPgo8dGQgd2lkdGg9IjMwJSI+IDxpbWcgc3JjPSJKYXZhJTIwU2NyaXB0aW5nJTIwUHJvZ3JhbW1lciUyN3MlMjBHdWlkZV9maWxlcy9sb2dvX29yYWNsZV9mb290ZXIuZ2lmIiBhbHQ9Ik9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMiIGJvcmRlcj0iMCIgaGVpZ2h0PSIyOSIgd2lkdGg9IjEwMCI+PGJyPgo8Zm9udCBzaXplPSIrMSI+IDxpPkphdmEgVGVjaG5vbG9neTwvaT48L2ZvbnQ+IDwvdGQ+Cgo8dGQgd2lkdGg9IjMwJSI+CjxwPjxmb250IHNpemU9Ii0yIj4KPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL2xlZ2FsL2NweXIuaHRtbCI+Q29weXJpZ2h0IKk8L2E+IDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCjwvZm9udD48L3A+IAo8L3RkPgo8dGQgd2lkdGg9IjMwJSI+CjxwIGFsaWduPSJyaWdodCI+PGZvbnQgc2l6ZT0iLTIiPjxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS9mZWVkYmFjay5odG1sIj5Db250YWN0IFVzPC9hPjwvZm9udD48L3A+PGZvbnQgc2l6ZT0iLTIiPgo8L2ZvbnQ+PC90ZD4KPC90cj4KPC90Ym9keT48L3RhYmxlPiAKPGRpdiBjbGFzcz0iaHIiPjxocj48L2Rpdj4KPC9kaXY+Cgo8IS0tIFN0YXJ0IFNpdGVDYXRhbHlzdCBjb2RlICAgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iSmF2YSUyMFNjcmlwdGluZyUyMFByb2dyYW1tZXIlMjdzJTIwR3VpZGVfZmlsZXMvc19jb2RlX2Rvd25sb2FkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJKYXZhJTIwU2NyaXB0aW5nJTIwUHJvZ3JhbW1lciUyN3MlMjBHdWlkZV9maWxlcy9zX2NvZGUuanMiPjwvc2NyaXB0PgogCjwhLS0gKioqKioqKioqKiBETyBOT1QgQUxURVIgQU5ZVEhJTkcgQkVMT1cgVEhJUyBMSU5FICEgKioqKioqKioqKiogLS0+CjwhLS0gIEJlbG93IGNvZGUgd2lsbCBzZW5kIHRoZSBpbmZvIHRvIE9tbml0dXJlIHNlcnZlciAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+dmFyIHNfY29kZT1zLnQoKTtpZihzX2NvZGUpZG9jdW1lbnQud3JpdGUoc19jb2RlKTwvc2NyaXB0PgogCjwhLS0gRW5kIFNpdGVDYXRhbHlzdCBjb2RlIC0tPgoKCgo8L2JvZHk+PC9odG1sPgo=