PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5tb2Rfc28gLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjQ8L3RpdGxlPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik1haW4gc3R5bGVzaGVldCIgLz4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC1sb29zZS0xMDBwYy5jc3MiIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTm8gU2lkZWJhciAtIERlZmF1bHQgZm9udCBzaXplIiAvPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLXByaW50LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIiAvPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlL2Nzcy9wcmV0dGlmeS5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuLi9zdHlsZS9zY3JpcHRzL3ByZXR0aWZ5Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPC9zY3JpcHQ+Cgo8bGluayBocmVmPSIuLi9pbWFnZXMvZmF2aWNvbi5pY28iIHJlbD0ic2hvcnRjdXQgaWNvbiIgLz48L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJwYWdlLWhlYWRlciI+CjxwIGNsYXNzPSJtZW51Ij48YSBocmVmPSIuLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4uL21vZC9kaXJlY3RpdmVzLmh0bWwiPkRpcmVjdGl2ZXM8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9odHRwZC9GQVEiPkZBUTwvYT4gfCA8YSBocmVmPSIuLi9nbG9zc2FyeS5odG1sIj5HbG9zc2FyeTwvYT4gfCA8YSBocmVmPSIuLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPgo8cCBjbGFzcz0iYXBhY2hlIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjQ8L3A+CjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2ZlYXRoZXIucG5nIiAvPjwvZGl2Pgo8ZGl2IGNsYXNzPSJ1cCI+PGEgaHJlZj0iLi8iPjxpbWcgdGl0bGU9IiZsdDstIiBhbHQ9IiZsdDstIiBzcmM9Ii4uL2ltYWdlcy9sZWZ0LmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgaWQ9InBhdGgiPgo8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGU8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvIj5IVFRQIFNlcnZlcjwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLyI+RG9jdW1lbnRhdGlvbjwvYT4gJmd0OyA8YSBocmVmPSIuLi8iPlZlcnNpb24gMi40PC9hPiAmZ3Q7IDxhIGhyZWY9Ii4vIj5Nb2R1bGVzPC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYWdlLWNvbnRlbnQiPgo8ZGl2IGlkPSJwcmVhbWJsZSI+PGgxPkFwYWNoZSBNb2R1bGUgbW9kX3NvPC9oMT4KPGRpdiBjbGFzcz0idG9wbGFuZyI+CjxwPjxzcGFuPkF2YWlsYWJsZSBMYW5ndWFnZXM6IDwvc3Bhbj48YSBocmVmPSIuLi9lbi9tb2QvbW9kX3NvLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3NvLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vamEvbW9kL21vZF9zby5odG1sIiBocmVmbGFuZz0iamEiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iSmFwYW5lc2UiPiZuYnNwO2phJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2tvL21vZC9tb2Rfc28uaHRtbCIgaHJlZmxhbmc9ImtvIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IktvcmVhbiI+Jm5ic3A7a28mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vdHIvbW9kL21vZF9zby5odG1sIiBocmVmbGFuZz0idHIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iVPxya+dlIj4mbmJzcDt0ciZuYnNwOzwvYT48L3A+CjwvZGl2Pgo8dGFibGUgY2xhc3M9Im1vZHVsZSI+PHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI0Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjo8L2E+PC90aD48dGQ+TG9hZGluZyBvZiBleGVjdXRhYmxlIGNvZGUgYW5kCm1vZHVsZXMgaW50byB0aGUgc2VydmVyIGF0IHN0YXJ0LXVwIG9yIHJlc3RhcnQgdGltZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5FeHRlbnNpb248L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNNb2R1bGVJZGVudGlmaWVyIj5Nb2R1bGWgSWRlbnRpZmllcjo8L2E+PC90aD48dGQ+c29fbW9kdWxlPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjU291cmNlRmlsZSI+U291cmNloEZpbGU6PC9hPjwvdGg+PHRkPm1vZF9zby5jPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSI+Q29tcGF0aWJpbGl0eTo8L2E+PC90aD48dGQ+VGhpcyBpcyBhIEJhc2UgbW9kdWxlIChhbHdheXMgaW5jbHVkZWQpIG9uCldpbmRvd3M8L3RkPjwvdHI+PC90YWJsZT4KPGgzPlN1bW1hcnk8L2gzPgoKCiAgICA8cD5PbiBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtcyB0aGlzIG1vZHVsZSBjYW4gYmUgdXNlZCB0bwogICAgbG9hZCBtb2R1bGVzIGludG8gQXBhY2hlIEhUVFAgU2VydmVyIGF0IHJ1bnRpbWUgdmlhIHRoZSA8YSBocmVmPSIuLi9kc28uaHRtbCI+RHluYW1pYyBTaGFyZWQgT2JqZWN0PC9hPiAoRFNPKSBtZWNoYW5pc20sCiAgICByYXRoZXIgdGhhbiByZXF1aXJpbmcgYSByZWNvbXBpbGF0aW9uLjwvcD4KCiAgICA8cD5PbiBVbml4LCB0aGUgbG9hZGVkIGNvZGUgdHlwaWNhbGx5IGNvbWVzIGZyb20gc2hhcmVkIG9iamVjdAogICAgZmlsZXMgKHVzdWFsbHkgd2l0aCA8Y29kZT4uc288L2NvZGU+IGV4dGVuc2lvbiksIG9uIFdpbmRvd3MKICAgIHRoaXMgbWF5IGVpdGhlciBiZSB0aGUgPGNvZGU+LnNvPC9jb2RlPiBvciA8Y29kZT4uZGxsPC9jb2RlPgogICAgZXh0ZW5zaW9uLjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj48aDM+V2FybmluZzwvaDM+CiAgICA8cD5Nb2R1bGVzIGJ1aWx0IGZvciBvbmUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgQXBhY2hlIEhUVFAgU2VydmVyCiAgICB3aWxsIGdlbmVyYWxseSBub3Qgd29yayBvbiBhbm90aGVyLiAoZS5nLiAxLjMgdnMuIDIuMCwgb3IgMi4wIHZzLgogICAgMi4yKSBUaGVyZSBhcmUgdXN1YWxseSBBUEkgY2hhbmdlcyBiZXR3ZWVuIG9uZSBtYWpvciB2ZXJzaW9uIGFuZAogICAgYW5vdGhlciB0aGF0IHJlcXVpcmUgdGhhdCBtb2R1bGVzIGJlIG1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgbmV3CiAgICB2ZXJzaW9uLjwvcD4KICAgIDwvZGl2Pgo8L2Rpdj4KPGRpdiBpZD0icXVpY2t2aWV3Ij48aDM+VG9waWNzPC9oMz4KPHVsIGlkPSJ0b3BpY3MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiN3aW5kb3dzIj5DcmVhdGluZyBMb2FkYWJsZSBNb2R1bGVzIGZvciBXaW5kb3dzPC9hPjwvbGk+CjwvdWw+PGgzIGNsYXNzPSJkaXJlY3RpdmVzIj5EaXJlY3RpdmVzPC9oMz4KPHVsIGlkPSJ0b2MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNsb2FkZmlsZSI+TG9hZEZpbGU8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvYT48L2xpPgo8L3VsPgo8aDM+QnVnZml4IGNoZWNrbGlzdDwvaDM+PHVsIGNsYXNzPSJzZWVhbHNvIj48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2h0dHBkL0NIQU5HRVNfMi40Ij5odHRwZCBjaGFuZ2Vsb2c8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9X19vcGVuX18mYW1wO2xpc3RfaWQ9MTQ0NTMyJmFtcDtwcm9kdWN0PUFwYWNoZSUyMGh0dHBkLTImYW1wO3F1ZXJ5X2Zvcm1hdD1zcGVjaWZpYyZhbXA7b3JkZXI9Y2hhbmdlZGRhdGUlMjBERVNDJTJDcHJpb3JpdHklMkNidWdfc2V2ZXJpdHkmYW1wO2NvbXBvbmVudD1tb2Rfc28iPktub3duIGlzc3VlczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUFwYWNoZSUyMGh0dHBkLTImYW1wO2NvbXBvbmVudD1tb2Rfc28iPlJlcG9ydCBhIGJ1ZzwvYT48L2xpPjwvdWw+PGgzPlNlZSBhbHNvPC9oMz4KPHVsIGNsYXNzPSJzZWVhbHNvIj4KPGxpPjxhIGhyZWY9IiNjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2xpPjwvdWw+PC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9IndpbmRvd3MiIGlkPSJ3aW5kb3dzIj5DcmVhdGluZyBMb2FkYWJsZSBNb2R1bGVzIGZvciBXaW5kb3dzPC9hPjwvaDI+CgogICAgPGRpdiBjbGFzcz0ibm90ZSI+PGgzPk5vdGU8L2gzPgogICAgPHA+T24gV2luZG93cywgd2hlcmUgbG9hZGFibGUgZmlsZXMgdHlwaWNhbGx5IGhhdmUgYSBmaWxlIGV4dGVuc2lvbgogICAgb2YgPGNvZGU+LmRsbDwvY29kZT4sIEFwYWNoZSBodHRwZCBtb2R1bGVzIGFyZSBjYWxsZWQKICAgIDxjb2RlPm1vZF93aGF0ZXZlci5zbzwvY29kZT4sIGp1c3QgYXMgdGhleSBhcmUgb24gb3RoZXIgcGxhdGZvcm1zLgogICAgSG93ZXZlciwgeW91IG1heSBlbmNvdW50ZXIgdGhpcmQtcGFydHkgbW9kdWxlcywgc3VjaCBhcyBQSFAgZm9yCiAgICBleGFtcGxlLCB0aGF0IGNvbnRpbnVlIHRvIHVzZSB0aGUgPGNvZGU+LmRsbDwvY29kZT4gY29udmVudGlvbi48L3A+CgogICAgPHA+V2hpbGUgPGNvZGU+bW9kX3NvPC9jb2RlPiBzdGlsbCBsb2FkcyBtb2R1bGVzIHdpdGgKICAgIDxjb2RlPkFwYWNoZU1vZHVsZUZvby5kbGw8L2NvZGU+IG5hbWVzLCB0aGUgbmV3IG5hbWluZyBjb252ZW50aW9uIGlzCiAgICBwcmVmZXJyZWQ7IGlmIHlvdSBhcmUgY29udmVydGluZyB5b3VyIGxvYWRhYmxlIG1vZHVsZSBmb3IgMi4wLAogICAgcGxlYXNlIGZpeCB0aGUgbmFtZSB0byB0aGlzIDIuMCBjb252ZW50aW9uLjwvcD48L2Rpdj4KCiAgICA8cD5UaGUgQXBhY2hlIGh0dHBkIG1vZHVsZSBBUEkgaXMgdW5jaGFuZ2VkIGJldHdlZW4gdGhlIFVuaXggYW5kCiAgICBXaW5kb3dzIHZlcnNpb25zLiBNYW55IG1vZHVsZXMgd2lsbCBydW4gb24gV2luZG93cyB3aXRoIG5vIG9yCiAgICBsaXR0bGUgY2hhbmdlIGZyb20gVW5peCwgYWx0aG91Z2ggb3RoZXJzIHJlbHkgb24gYXNwZWN0cyBvZiB0aGUKICAgIFVuaXggYXJjaGl0ZWN0dXJlIHdoaWNoIGFyZSBub3QgcHJlc2VudCBpbiBXaW5kb3dzLCBhbmQgd2lsbAogICAgbm90IHdvcmsuPC9wPgoKICAgIDxwPldoZW4gYSBtb2R1bGUgZG9lcyB3b3JrLCBpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlcnZlciBpbgogICAgb25lIG9mIHR3byB3YXlzLiBBcyB3aXRoIFVuaXgsIGl0IGNhbiBiZSBjb21waWxlZCBpbnRvIHRoZQogICAgc2VydmVyLiBCZWNhdXNlIEFwYWNoZSBodHRwZCBmb3IgV2luZG93cyBkb2VzIG5vdCBoYXZlIHRoZQogICAgPGNvZGU+Q29uZmlndXJlPC9jb2RlPiBwcm9ncmFtIG9mIEFwYWNoZSBodHRwZCBmb3IgVW5peCwgdGhlIG1vZHVsZSdzCiAgICBzb3VyY2UgZmlsZSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBBcGFjaGVDb3JlIHByb2plY3QgZmlsZSwgYW5kCiAgICBpdHMgc3ltYm9scyBtdXN0IGJlIGFkZGVkIHRvIHRoZQogICAgPGNvZGU+b3Ncd2luMzJcbW9kdWxlcy5jPC9jb2RlPiBmaWxlLjwvcD4KCiAgICA8cD5UaGUgc2Vjb25kIHdheSBpcyB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgYSBETEwsIGEgc2hhcmVkCiAgICBsaWJyYXJ5IHRoYXQgY2FuIGJlIGxvYWRlZCBpbnRvIHRoZSBzZXJ2ZXIgYXQgcnVudGltZSwgdXNpbmcKICAgIHRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5Mb2FkTW9kdWxlPC9jb2RlPgogICAgZGlyZWN0aXZlLiBUaGVzZSBtb2R1bGUgRExMcyBjYW4gYmUgZGlzdHJpYnV0ZWQgYW5kIHJ1biBvbiBhbnkKICAgIEFwYWNoZSBodHRwZCBmb3IgV2luZG93cyBpbnN0YWxsYXRpb24sIHdpdGhvdXQgcmVjb21waWxhdGlvbiBvZiB0aGUKICAgIHNlcnZlci48L3A+CgogICAgPHA+VG8gY3JlYXRlIGEgbW9kdWxlIERMTCwgYSBzbWFsbCBjaGFuZ2UgaXMgbmVjZXNzYXJ5IHRvIHRoZQogICAgbW9kdWxlJ3Mgc291cmNlIGZpbGU6IFRoZSBtb2R1bGUgcmVjb3JkIG11c3QgYmUgZXhwb3J0ZWQgZnJvbQogICAgdGhlIERMTCAod2hpY2ggd2lsbCBiZSBjcmVhdGVkIGxhdGVyOyBzZWUgYmVsb3cpLiBUbyBkbyB0aGlzLAogICAgYWRkIHRoZSA8Y29kZT5BUF9NT0RVTEVfREVDTEFSRV9EQVRBPC9jb2RlPiAoZGVmaW5lZCBpbiB0aGUKICAgIEFwYWNoZSBodHRwZCBoZWFkZXIgZmlsZXMpIHRvIHlvdXIgbW9kdWxlJ3MgbW9kdWxlIHJlY29yZCBkZWZpbml0aW9uLgogICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgbW9kdWxlIGhhczo8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgIG1vZHVsZSBmb29fbW9kdWxlOwo8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPlJlcGxhY2UgdGhlIGFib3ZlIHdpdGg6PC9wPgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICAgIG1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIGZvb19tb2R1bGU7CjwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIGFjdGl2YXRlZCBvbiBXaW5kb3dzLCBzbyB0aGUKICAgIG1vZHVsZSBjYW4gY29udGludWUgdG8gYmUgdXNlZCwgdW5jaGFuZ2VkLCB3aXRoIFVuaXggaWYgbmVlZGVkLgogICAgQWxzbywgaWYgeW91IGFyZSBmYW1pbGlhciB3aXRoIDxjb2RlPi5ERUY8L2NvZGU+IGZpbGVzLCB5b3UgY2FuCiAgICBleHBvcnQgdGhlIG1vZHVsZSByZWNvcmQgd2l0aCB0aGF0IG1ldGhvZCBpbnN0ZWFkLjwvcD4KCiAgICA8cD5Ob3csIGNyZWF0ZSBhIERMTCBjb250YWluaW5nIHlvdXIgbW9kdWxlLiBZb3Ugd2lsbCBuZWVkIHRvCiAgICBsaW5rIHRoaXMgYWdhaW5zdCB0aGUgbGliaHR0cGQubGliIGV4cG9ydCBsaWJyYXJ5IHRoYXQgaXMKICAgIGNyZWF0ZWQgd2hlbiB0aGUgbGliaHR0cGQuZGxsIHNoYXJlZCBsaWJyYXJ5IGlzIGNvbXBpbGVkLiBZb3UKICAgIG1heSBhbHNvIGhhdmUgdG8gY2hhbmdlIHRoZSBjb21waWxlciBzZXR0aW5ncyB0byBlbnN1cmUgdGhhdAogICAgdGhlIEFwYWNoZSBodHRwZCBoZWFkZXIgZmlsZXMgYXJlIGNvcnJlY3RseSBsb2NhdGVkLiBZb3UgY2FuIGZpbmQKICAgIHRoaXMgbGlicmFyeSBpbiB5b3VyIHNlcnZlciByb290J3MgbW9kdWxlcyBkaXJlY3RvcnkuIEl0IGlzCiAgICBiZXN0IHRvIGdyYWIgYW4gZXhpc3RpbmcgbW9kdWxlIC5kc3AgZmlsZSBmcm9tIHRoZSB0cmVlIHRvCiAgICBhc3N1cmUgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LCBvcgogICAgYWx0ZXJuYXRlbHkgY29tcGFyZSB0aGUgY29tcGlsZXIgYW5kIGxpbmsgb3B0aW9ucyB0byB5b3VyCiAgICAuZHNwLjwvcD4KCiAgICA8cD5UaGlzIHNob3VsZCBjcmVhdGUgYSBETEwgdmVyc2lvbiBvZiB5b3VyIG1vZHVsZS4gTm93IHNpbXBseQogICAgcGxhY2UgaXQgaW4gdGhlIDxjb2RlPm1vZHVsZXM8L2NvZGU+IGRpcmVjdG9yeSBvZiB5b3VyIHNlcnZlcgogICAgcm9vdCwgYW5kIHVzZSB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+TG9hZE1vZHVsZTwvY29kZT4KICAgIGRpcmVjdGl2ZSB0byBsb2FkIGl0LjwvcD4KCjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0iZGlyZWN0aXZlLXNlY3Rpb24iPjxoMj48YSBuYW1lPSJMb2FkRmlsZSIgaWQ9IkxvYWRGaWxlIj5Mb2FkRmlsZTwvYT4gPGEgbmFtZT0ibG9hZGZpbGUiIGlkPSJsb2FkZmlsZSI+RGlyZWN0aXZlPC9hPjwvaDI+Cjx0YWJsZSBjbGFzcz0iZGlyZWN0aXZlIj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjo8L2E+PC90aD48dGQ+TGluayBpbiB0aGUgbmFtZWQgb2JqZWN0IGZpbGUgb3IgbGlicmFyeTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5Mb2FkRmlsZSA8ZW0+ZmlsZW5hbWU8L2VtPiBbPGVtPmZpbGVuYW1lPC9lbT5dIC4uLjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0Ij5Db250ZXh0OjwvYT48L3RoPjx0ZD5zZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1czo8L2E+PC90aD48dGQ+RXh0ZW5zaW9uPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9zbzwvdGQ+PC90cj4KPC90YWJsZT4KCiAgICA8cD5UaGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+TG9hZEZpbGU8L2NvZGU+IGRpcmVjdGl2ZSBsaW5rcyBpbiB0aGUgbmFtZWQgb2JqZWN0IGZpbGVzIG9yCiAgICBsaWJyYXJpZXMgd2hlbiB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgb3IgcmVzdGFydGVkOyB0aGlzIGlzIHVzZWQKICAgIHRvIGxvYWQgYWRkaXRpb25hbCBjb2RlIHdoaWNoIG1heSBiZSByZXF1aXJlZCBmb3Igc29tZSBtb2R1bGUKICAgIHRvIHdvcmsuIDxlbT5GaWxlbmFtZTwvZW0+IGlzIGVpdGhlciBhbiBhYnNvbHV0ZSBwYXRoIG9yCiAgICByZWxhdGl2ZSB0byA8YSBocmVmPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT4uPC9wPgoKICAgIDxwPkZvciBleGFtcGxlOjwvcD4KCiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+TG9hZEZpbGUgImxpYmV4ZWMvbGlieG1scGFyc2Uuc28iPC9wcmU+CgoKCjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0iZGlyZWN0aXZlLXNlY3Rpb24iPjxoMj48YSBuYW1lPSJMb2FkTW9kdWxlIiBpZD0iTG9hZE1vZHVsZSI+TG9hZE1vZHVsZTwvYT4gPGEgbmFtZT0ibG9hZG1vZHVsZSIgaWQ9ImxvYWRtb2R1bGUiPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPkxpbmtzIGluIHRoZSBvYmplY3QgZmlsZSBvciBsaWJyYXJ5LCBhbmQgYWRkcyB0byB0aGUgbGlzdApvZiBhY3RpdmUgbW9kdWxlczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5Mb2FkTW9kdWxlIDxlbT5tb2R1bGUgZmlsZW5hbWU8L2VtPjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0Ij5Db250ZXh0OjwvYT48L3RoPjx0ZD5zZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1czo8L2E+PC90aD48dGQ+RXh0ZW5zaW9uPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9zbzwvdGQ+PC90cj4KPC90YWJsZT4KICAgIDxwPlRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5Mb2FkTW9kdWxlPC9jb2RlPiBkaXJlY3RpdmUgbGlua3MgaW4gdGhlIG9iamVjdCBmaWxlIG9yIGxpYnJhcnkKICAgIDxlbT5maWxlbmFtZTwvZW0+IGFuZCBhZGRzIHRoZSBtb2R1bGUgc3RydWN0dXJlIG5hbWVkCiAgICA8ZW0+bW9kdWxlPC9lbT4gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIG1vZHVsZXMuIDxlbT5Nb2R1bGU8L2VtPgogICAgaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHZhcmlhYmxlIG9mIHR5cGUKICAgIDxjb2RlPm1vZHVsZTwvY29kZT4gaW4gdGhlIGZpbGUsIGFuZCBpcyBsaXN0ZWQgYXMgdGhlIDxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjTW9kdWxlSWRlbnRpZmllciI+TW9kdWxlIElkZW50aWZpZXI8L2E+CiAgICBpbiB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24uPC9wPgoKICAgIDxwPkZvciBleGFtcGxlOjwvcD4KCiAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+TG9hZE1vZHVsZSBzdGF0dXNfbW9kdWxlICJtb2R1bGVzL21vZF9zdGF0dXMuc28iPC9wcmU+CgoKICAgIDxwPmxvYWRzIHRoZSBuYW1lZCBtb2R1bGUgZnJvbSB0aGUgbW9kdWxlcyBzdWJkaXJlY3Rvcnkgb2YgdGhlCiAgICBTZXJ2ZXJSb290LjwvcD4KCjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iYm90dG9tbGFuZyI+CjxwPjxzcGFuPkF2YWlsYWJsZSBMYW5ndWFnZXM6IDwvc3Bhbj48YSBocmVmPSIuLi9lbi9tb2QvbW9kX3NvLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3NvLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vamEvbW9kL21vZF9zby5odG1sIiBocmVmbGFuZz0iamEiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iSmFwYW5lc2UiPiZuYnNwO2phJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4uL2tvL21vZC9tb2Rfc28uaHRtbCIgaHJlZmxhbmc9ImtvIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IktvcmVhbiI+Jm5ic3A7a28mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi4vdHIvbW9kL21vZF9zby5odG1sIiBocmVmbGFuZz0idHIiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iVPxya+dlIj4mbmJzcDt0ciZuYnNwOzwvYT48L3A+CjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgYWx0PSJ0b3AiIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxoMj48YSBpZD0iY29tbWVudHNfc2VjdGlvbiIgbmFtZT0iY29tbWVudHNfc2VjdGlvbiI+Q29tbWVudHM8L2E+PC9oMj48ZGl2IGNsYXNzPSJ3YXJuaW5nIj48c3Ryb25nPk5vdGljZTo8L3N0cm9uZz48YnIgLz5UaGlzIGlzIG5vdCBhIFEmYW1wO0Egc2VjdGlvbi4gQ29tbWVudHMgcGxhY2VkIGhlcmUgc2hvdWxkIGJlIHBvaW50ZWQgdG93YXJkcyBzdWdnZXN0aW9ucyBvbiBpbXByb3ZpbmcgdGhlIGRvY3VtZW50YXRpb24gb3Igc2VydmVyLCBhbmQgbWF5IGJlIHJlbW92ZWQgYWdhaW4gYnkgb3VyIG1vZGVyYXRvcnMgaWYgdGhleSBhcmUgZWl0aGVyIGltcGxlbWVudGVkIG9yIGNvbnNpZGVyZWQgaW52YWxpZC9vZmYtdG9waWMuIFF1ZXN0aW9ucyBvbiBob3cgdG8gbWFuYWdlIHRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgc2hvdWxkIGJlIGRpcmVjdGVkIGF0IGVpdGhlciBvdXIgSVJDIGNoYW5uZWwsICNodHRwZCwgb24gRnJlZW5vZGUsIG9yIHNlbnQgdG8gb3VyIDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2xpc3RzLmh0bWwiPm1haWxpbmcgbGlzdHM8L2E+LjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQp2YXIgY29tbWVudHNfc2hvcnRuYW1lID0gJ2h0dHBkJzsKdmFyIGNvbW1lbnRzX2lkZW50aWZpZXIgPSAnaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjQvbW9kL21vZF9zby5odG1sJzsKKGZ1bmN0aW9uKHcsIGQpIHsKICAgIGlmICh3LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT0gImh0dHBkLmFwYWNoZS5vcmciKSB7CiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj48XC9kaXY+Jyk7CiAgICAgICAgdmFyIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIHMuYXN5bmMgPSB0cnVlOwogICAgICAgIHMuc3JjID0gJ2h0dHBzOi8vY29tbWVudHMuYXBhY2hlLm9yZy9zaG93X2NvbW1lbnRzLmx1YT9zaXRlPScgKyBjb21tZW50c19zaG9ydG5hbWUgKyAnJnBhZ2U9JyArIGNvbW1lbnRzX2lkZW50aWZpZXI7CiAgICAgICAgKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0pLmFwcGVuZENoaWxkKHMpOwogICAgfQogICAgZWxzZSB7IAogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+Q29tbWVudHMgYXJlIGRpc2FibGVkIGZvciB0aGlzIHBhZ2UgYXQgdGhlIG1vbWVudC48XC9kaXY+Jyk7CiAgICB9Cn0pKHdpbmRvdywgZG9jdW1lbnQpOwovLy0tPjwhXV0+PC9zY3JpcHQ+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQppZiAodHlwZW9mKHByZXR0eVByaW50KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIHByZXR0eVByaW50KCk7Cn0KLy8tLT48IV1dPjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg==