PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPjxsaW5rIHJlbD0iU0hPUlRDVVQgSUNPTiIgaHJlZj0iL2Zhdmljb24uaWNvIiAvPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+ClREIHtmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2F9CkJPRFkge2ZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLEhlbHZldGljYTsgbWFyZ2luLXRvcDogMmVtOyBtYXJnaW4tbGVmdDogMGVtOyBtYXJnaW4tcmlnaHQ6IDBlbX0KSDEge2ZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLEhlbHZldGljYX0KSDIge2ZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLEhlbHZldGljYX0KSDMge2ZvbnQtZmFtaWx5OiBWZXJkYW5hLEFyaWFsLEhlbHZldGljYX0KQTpsaW5rLCBBOnZpc2l0ZWQsIEE6YWN0aXZlIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQo8L3N0eWxlPjx0aXRsZT5JL08gSW50ZXJmYWNlczwvdGl0bGU+PC9oZWFkPjxib2R5IGJnY29sb3I9IiM4Yjc3NjUiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwMDAiIHZsaW5rPSIjMDAwMDAwIj48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj48dHI+PHRkIHdpZHRoPSIxODAiPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ25vbWUub3JnLyI+PGltZyBzcmM9Imdub21lMi5wbmciIGFsdD0iR25vbWUyIExvZ28iIC8+PC9hPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N0YXR1cyI+PGltZyBzcmM9InczYy5wbmciIGFsdD0iVzNDIExvZ28iIC8+PC9hPjxhIGhyZWY9Imh0dHA6Ly93d3cucmVkaGF0LmNvbS8iPjxpbWcgc3JjPSJyZWRoYXQuZ2lmIiBhbHQ9IlJlZCBIYXQgTG9nbyIgLz48L2E+PGRpdiBhbGlnbj0ibGVmdCI+PGEgaHJlZj0iaHR0cDovL3htbHNvZnQub3JnLyI+PGltZyBzcmM9IkxpYnhtbDItTG9nby0xODB4MTY4LmdpZiIgYWx0PSJNYWRlIHdpdGggTGlieG1sMiBMb2dvIiAvPjwvYT48L2Rpdj48L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiMwMDAwMDAiPjx0cj48dGQ+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMyIgYmdjb2xvcj0iI2ZmZmFjZCI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIj48aDE+VGhlIFhNTCBDIHBhcnNlciBhbmQgdG9vbGtpdCBvZiBHbm9tZTwvaDE+PGgyPkkvTyBJbnRlcmZhY2VzPC9oMj48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj48dHI+PHRkIGJnY29sb3I9IiM4Yjc3NjUiPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMDAiIGJnY29sb3I9IiM4Yjc3NjUiPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiMwMDAwMDAiPjx0cj48dGQ+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMyI+PHRyPjx0ZCBjb2xzcGFuPSIxIiBiZ2NvbG9yPSIjZWVjZmExIiBhbGlnbj0iY2VudGVyIj48Y2VudGVyPjxiPkRldmVsb3BlciBNZW51PC9iPjwvY2VudGVyPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNmZmZhY2QiPjxmb3JtIGFjdGlvbj0ic2VhcmNoLnBocCIgZW5jdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiBtZXRob2Q9ImdldCI+PGlucHV0IG5hbWU9InF1ZXJ5IiB0eXBlPSJ0ZXh0IiBzaXplPSIyMCIgdmFsdWU9IiIgLz48aW5wdXQgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2ggLi4uIiAvPjwvZm9ybT48dWw+PGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC9saT48bGk+PGEgaHJlZj0iZ3VpZGVsaW5lcy5odG1sIj5YTUwgR3VpZGVsaW5lczwvYT48L2xpPjxsaT48YSBocmVmPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvYT48L2xpPjxsaT48YSBocmVmPSJ4bWxyZWFkZXIuaHRtbCI+VGhlIFJlYWRlciBJbnRlcmZhY2U8L2E+PC9saT48bGk+PGEgaHJlZj0iWFNMVC5odG1sIj5YU0xUPC9hPjwvbGk+PGxpPjxhIGhyZWY9InB5dGhvbi5odG1sIj5QeXRob24gYW5kIGJpbmRpbmdzPC9hPjwvbGk+PGxpPjxhIGhyZWY9ImFyY2hpdGVjdHVyZS5odG1sIj5saWJ4bWwyIGFyY2hpdGVjdHVyZTwvYT48L2xpPjxsaT48YSBocmVmPSJ0cmVlLmh0bWwiPlRoZSB0cmVlIG91dHB1dDwvYT48L2xpPjxsaT48YSBocmVmPSJpbnRlcmZhY2UuaHRtbCI+VGhlIFNBWCBpbnRlcmZhY2U8L2E+PC9saT48bGk+PGEgaHJlZj0ieG1sbWVtLmh0bWwiPk1lbW9yeSBNYW5hZ2VtZW50PC9hPjwvbGk+PGxpPjxhIGhyZWY9InhtbGlvLmh0bWwiPkkvTyBJbnRlcmZhY2VzPC9hPjwvbGk+PGxpPjxhIGhyZWY9ImxpYnJhcnkuaHRtbCI+VGhlIHBhcnNlciBpbnRlcmZhY2VzPC9hPjwvbGk+PGxpPjxhIGhyZWY9ImVudGl0aWVzLmh0bWwiPkVudGl0aWVzIG9yIG5vIGVudGl0aWVzPC9hPjwvbGk+PGxpPjxhIGhyZWY9Im5hbWVzcGFjZXMuaHRtbCI+TmFtZXNwYWNlczwvYT48L2xpPjxsaT48YSBocmVmPSJ1cGdyYWRlLmh0bWwiPlVwZ3JhZGluZyAxLnggY29kZTwvYT48L2xpPjxsaT48YSBocmVmPSJ0aHJlYWRzLmh0bWwiPlRocmVhZCBzYWZldHk8L2E+PC9saT48bGk+PGEgaHJlZj0iRE9NLmh0bWwiPkRPTSBQcmluY2lwbGVzPC9hPjwvbGk+PGxpPjxhIGhyZWY9ImV4YW1wbGUuaHRtbCI+QSByZWFsIGV4YW1wbGU8L2E+PC9saT48bGk+PGEgaHJlZj0ieG1sLmh0bWwiPmZsYXQgcGFnZTwvYT4sIDxhIGhyZWY9InNpdGUueHNsIj5zdHlsZXNoZWV0PC9hPjwvbGk+PC91bD48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIzIj48dHI+PHRkIGNvbHNwYW49IjEiIGJnY29sb3I9IiNlZWNmYTEiIGFsaWduPSJjZW50ZXIiPjxjZW50ZXI+PGI+QVBJIEluZGV4ZXM8L2I+PC9jZW50ZXI+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iI2ZmZmFjZCI+PHVsPjxsaT48YSBocmVmPSJBUEljaHVuazAuaHRtbCI+QWxwaGFiZXRpYzwvYT48L2xpPjxsaT48YSBocmVmPSJBUEljb25zdHJ1Y3RvcnMuaHRtbCI+Q29uc3RydWN0b3JzPC9hPjwvbGk+PGxpPjxhIGhyZWY9IkFQSWZ1bmN0aW9ucy5odG1sIj5GdW5jdGlvbnMvVHlwZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iQVBJZmlsZXMuaHRtbCI+TW9kdWxlczwvYT48L2xpPjxsaT48YSBocmVmPSJBUElzeW1ib2xzLmh0bWwiPlN5bWJvbHM8L2E+PC9saT48L3VsPjwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjMiPjx0cj48dGQgY29sc3Bhbj0iMSIgYmdjb2xvcj0iI2VlY2ZhMSIgYWxpZ249ImNlbnRlciI+PGNlbnRlcj48Yj5SZWxhdGVkIGxpbmtzPC9iPjwvY2VudGVyPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNmZmZhY2QiPjx1bD48bGk+PGEgaHJlZj0iaHR0cDovL21haWwuZ25vbWUub3JnL2FyY2hpdmVzL3htbC8iPk1haWwgYXJjaGl2ZTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8veG1sc29mdC5vcmcvWFNMVC8iPlhTTFQgbGlieHNsdDwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vcGhkLmNzLnVuaWJvLml0L2dkb21lMi8iPkRPTSBnZG9tZTI8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hbGVrc2V5LmNvbS94bWxzZWMvIj5YTUwtRFNpZyB4bWxzZWM8L2E+PC9saT48bGk+PGEgaHJlZj0iZnRwOi8veG1sc29mdC5vcmcvIj5GVFA8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy56bGF0a292aWMuY29tL3Byb2plY3RzL2xpYnhtbC8iPldpbmRvd3MgYmluYXJpZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL2dhcnlwZW5uaW5ndG9uLm5ldC9saWJ4bWwyLyI+U29sYXJpcyBiaW5hcmllczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3Lnp2ZW5vLmNvbS9vcGVuX3NvdXJjZS9saWJ4bWwyeHNsdC5odG1sIj5NYWNPc1ggYmluYXJpZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJ4bWwyLXBhcy8iPlBhc2NhbCBiaW5kaW5nczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL2J1Z2xpc3QuY2dpP3Byb2R1Y3Q9bGlieG1sMiI+QnVnIFRyYWNrZXI8L2E+PC9saT48L3VsPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjOGI3NzY1Ij48dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiMwMDAwMDAiPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCBiZ2NvbG9yPSIjZmZmYWNkIj48cD5UYWJsZSBvZiBDb250ZW50OjwvcD48b2w+PGxpPjxhIGhyZWY9IiNHZW5lcmFsMSI+R2VuZXJhbCBvdmVydmlldzwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjYmFzaWMiPlRoZSBiYXNpYyBidWZmZXIgdHlwZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjSW5wdXQiPklucHV0IEkvTyBoYW5kbGVyczwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjT3V0cHV0Ij5PdXRwdXQgSS9PIGhhbmRsZXJzPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNlbnRpdGllcyI+VGhlIGVudGl0aWVzIGxvYWRlcjwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjRXhhbXBsZTIiPkV4YW1wbGUgb2YgY3VzdG9taXplZCBJL088L2E+PC9saT4KPC9vbD48aDM+PGEgbmFtZT0iR2VuZXJhbDEiIGlkPSJHZW5lcmFsMSI+R2VuZXJhbCBvdmVydmlldzwvYT48L2gzPjxwPlRoZSBtb2R1bGUgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3htbHNvZnQub3JnL2h0bWwvbGlieG1sLXhtbGlvLmh0bWwiPnhtbElPLmg8L2E+PC9jb2RlPiBwcm92aWRlcwp0aGUgaW50ZXJmYWNlcyB0byB0aGUgbGlieG1sMiBJL08gc3lzdGVtLiBUaGlzIGNvbnNpc3RzIG9mIDQgbWFpbiBwYXJ0czo8L3A+PHVsPjxsaT5FbnRpdGllcyBsb2FkZXIsIHRoaXMgaXMgYSByb3V0aW5lIHdoaWNoIHRyaWVzIHRvIGZldGNoIHRoZSBlbnRpdGllcwogICAgKGZpbGVzKSBiYXNlZCBvbiB0aGVpciBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVycy4gVGhlIGRlZmF1bHQgbG9hZGVyCiAgICBkb24ndCBsb29rIGF0IHRoZSBwdWJsaWMgaWRlbnRpZmllciBzaW5jZSBsaWJ4bWwyIGRvIG5vdCBtYWludGFpbiBhCiAgICBjYXRhbG9nLiBZb3UgY2FuIHJlZGVmaW5lIHlvdSBvd24gZW50aXR5IGxvYWRlciBieSB1c2luZwogICAgPGNvZGU+eG1sR2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoKTwvY29kZT4gYW5kCiAgICA8Y29kZT54bWxTZXRFeHRlcm5hbEVudGl0eUxvYWRlcigpPC9jb2RlPi4gPGEgaHJlZj0iI2VudGl0aWVzIj5DaGVjayB0aGUKICAgIGV4YW1wbGU8L2E+LjwvbGk+CiAgPGxpPklucHV0IEkvTyBidWZmZXJzIHdoaWNoIGFyZSBhIGNvbW1vZGl0eSBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcGFyc2VyKHMpCiAgICBpbnB1dCBsYXllciB0byBoYW5kbGUgZmV0Y2hpbmcgdGhlIGluZm9ybWF0aW9ucyB0byBmZWVkIHRoZSBwYXJzZXIuIFRoaXMKICAgIHByb3ZpZGVzIGJ1ZmZlcmluZyBhbmQgaXMgYWxzbyBhIHBsYWNlaG9sZGVyIHdoZXJlIHRoZSBlbmNvZGluZwogICAgY29udmVydGVycyB0byBVVEY4IGFyZSBwaWdneS1iYWNrZWQuPC9saT4KICA8bGk+T3V0cHV0IEkvTyBidWZmZXJzIGFyZSBzaW1pbGFyIHRvIHRoZSBJbnB1dCBvbmVzIGFuZCBmdWxmaWxsIHNpbWlsYXIKICAgIHRhc2sgYnV0IHdoZW4gZ2VuZXJhdGluZyBhIHNlcmlhbGl6YXRpb24gZnJvbSBhIHRyZWUuPC9saT4KICA8bGk+QSBtZWNoYW5pc20gdG8gcmVnaXN0ZXIgc2V0cyBvZiBJL08gY2FsbGJhY2tzIGFuZCBhc3NvY2lhdGUgdGhlbSB3aXRoCiAgICBzcGVjaWZpYyBuYW1pbmcgc2NoZW1lcyBsaWtlIHRoZSBwcm90b2NvbCBwYXJ0IG9mIHRoZSBVUklzLgogICAgPHA+VGhpcyBhZmZlY3QgdGhlIGRlZmF1bHQgSS9PIG9wZXJhdGlvbnMgYW5kIGFsbG93cyB0byB1c2Ugc3BlY2lmaWMgSS9PCiAgICBoYW5kbGVycyBmb3IgY2VydGFpbiBuYW1lcy48L3A+CiAgPC9saT4KPC91bD48cD5UaGUgZ2VuZXJhbCBtZWNoYW5pc20gdXNlZCB3aGVuIGxvYWRpbmcgaHR0cDovL3JwbWZpbmQubmV0L3htbC5odG1sIGZvcgpleGFtcGxlIGluIHRoZSBIVE1MIHBhcnNlciBpcyB0aGUgZm9sbG93aW5nOjwvcD48b2w+PGxpPlRoZSBkZWZhdWx0IGVudGl0eSBsb2FkZXIgY2FsbHMgPGNvZGU+eG1sTmV3SW5wdXRGcm9tRmlsZSgpPC9jb2RlPiB3aXRoCiAgICB0aGUgcGFyc2luZyBjb250ZXh0IGFuZCB0aGUgVVJJIHN0cmluZy48L2xpPgogIDxsaT50aGUgVVJJIHN0cmluZyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGV4aXN0aW5nIHJlZ2lzdGVyZWQgaGFuZGxlcnMKICAgIHVzaW5nIHRoZWlyIG1hdGNoKCkgY2FsbGJhY2sgZnVuY3Rpb24sIGlmIHRoZSBIVFRQIG1vZHVsZSB3YXMgY29tcGlsZWQKICAgIGluLCBpdCBpcyByZWdpc3RlcmVkIGFuZCBpdHMgbWF0Y2goKSBmdW5jdGlvbiB3aWxsIHN1Y2NlZWRzPC9saT4KICA8bGk+dGhlIG9wZW4oKSBmdW5jdGlvbiBvZiB0aGUgaGFuZGxlciBpcyBjYWxsZWQgYW5kIGlmIHN1Y2Nlc3NmdWwgd2lsbAogICAgcmV0dXJuIGFuIEkvTyBJbnB1dCBidWZmZXI8L2xpPgogIDxsaT50aGUgcGFyc2VyIHdpbGwgdGhlIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGlzIGJ1ZmZlciBhbmQgcHJvZ3Jlc3NpdmVseQogICAgZmV0Y2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzb3VyY2UsIGNhbGxpbmcgdGhlIHJlYWQoKSBmdW5jdGlvbiBvZiB0aGUKICAgIGhhbmRsZXIgdW50aWwgdGhlIHJlc291cmNlIGlzIGV4aGF1c3RlZDwvbGk+CiAgPGxpPmlmIGFuIGVuY29kaW5nIGNoYW5nZSBpcyBkZXRlY3RlZCBpdCB3aWxsIGJlIGluc3RhbGxlZCBvbiB0aGUgaW5wdXQKICAgIGJ1ZmZlciwgcHJvdmlkaW5nIGJ1ZmZlcmluZyBhbmQgZWZmaWNpZW50IHVzZSBvZiB0aGUgY29udmVyc2lvbgogIHJvdXRpbmVzPC9saT4KICA8bGk+b25jZSB0aGUgcGFyc2VyIGhhcyBmaW5pc2hlZCwgdGhlIGNsb3NlKCkgZnVuY3Rpb24gb2YgdGhlIGhhbmRsZXIgaXMKICAgIGNhbGxlZCBvbmNlIGFuZCB0aGUgSW5wdXQgYnVmZmVyIGFuZCBhc3NvY2lhdGVkIHJlc291cmNlcyBhcmUKICBkZWFsbG9jYXRlZC48L2xpPgo8L29sPjxwPlRoZSB1c2VyIGRlZmluZWQgY2FsbGJhY2tzIGFyZSBjaGVja2VkIGZpcnN0IHRvIGFsbG93IG92ZXJyaWRpbmcgb2YgdGhlCmRlZmF1bHQgbGlieG1sMiBJL08gcm91dGluZXMuPC9wPjxoMz48YSBuYW1lPSJiYXNpYyIgaWQ9ImJhc2ljIj5UaGUgYmFzaWMgYnVmZmVyIHR5cGU8L2E+PC9oMz48cD5BbGwgdGhlIGJ1ZmZlciBtYW5pcHVsYXRpb24gaGFuZGxpbmcgaXMgZG9uZSB1c2luZyB0aGUKPGNvZGU+eG1sQnVmZmVyPC9jb2RlPiB0eXBlIGRlZmluZSBpbiA8Y29kZT48YSBocmVmPSJodHRwOi8veG1sc29mdC5vcmcvaHRtbC9saWJ4bWwtdHJlZS5odG1sIj50cmVlLmg8L2E+IDwvY29kZT53aGljaCBpcyBhCnJlc2l6YWJsZSBtZW1vcnkgYnVmZmVyLiBUaGUgYnVmZmVyIGFsbG9jYXRpb24gc3RyYXRlZ3kgY2FuIGJlIHNlbGVjdGVkIHRvIGJlCmVpdGhlciBiZXN0LWZpdCBvciB1c2UgYW4gZXhwb25lbnRpYWwgZG91Ymxpbmcgb25lIChDUFUgdnMuIG1lbW9yeSB1c2UKdHJhZGUtb2ZmKS4gVGhlIHZhbHVlcyBhcmUgPGNvZGU+WE1MX0JVRkZFUl9BTExPQ19FWEFDVDwvY29kZT4gYW5kCjxjb2RlPlhNTF9CVUZGRVJfQUxMT0NfRE9VQkxFSVQ8L2NvZGU+LCBhbmQgY2FuIGJlIHNldCBpbmRpdmlkdWFsbHkgb3Igb24gYQpzeXN0ZW0gd2lkZSBiYXNpcyB1c2luZyA8Y29kZT54bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKCk8L2NvZGU+LiBBIG51bWJlcgpvZiBmdW5jdGlvbnMgYWxsb3dzIHRvIG1hbmlwdWxhdGUgYnVmZmVycyB3aXRoIG5hbWVzIHN0YXJ0aW5nIHdpdGggdGhlCjxjb2RlPnhtbEJ1ZmZlci4uLjwvY29kZT4gcHJlZml4LjwvcD48aDM+PGEgbmFtZT0iSW5wdXQiIGlkPSJJbnB1dCI+SW5wdXQgSS9PIGhhbmRsZXJzPC9hPjwvaDM+PHA+QW4gSW5wdXQgSS9PIGhhbmRsZXIgaXMgYSBzaW1wbGUgc3RydWN0dXJlCjxjb2RlPnhtbFBhcnNlcklucHV0QnVmZmVyPC9jb2RlPiBjb250YWluaW5nIGEgY29udGV4dCBhc3NvY2lhdGVkIHRvIHRoZQpyZXNvdXJjZSAoZmlsZSBkZXNjcmlwdG9yLCBvciBwb2ludGVyIHRvIGEgcHJvdG9jb2wgaGFuZGxlciksIHRoZSByZWFkKCkgYW5kCmNsb3NlKCkgY2FsbGJhY2tzIHRvIHVzZSBhbmQgYW4geG1sQnVmZmVyLiBBbmQgZXh0cmEgeG1sQnVmZmVyIGFuZCBhIGNoYXJzZXQKZW5jb2RpbmcgaGFuZGxlciBhcmUgYWxzbyBwcmVzZW50IHRvIHN1cHBvcnQgY2hhcnNldCBjb252ZXJzaW9uIHdoZW4KbmVlZGVkLjwvcD48aDM+PGEgbmFtZT0iT3V0cHV0IiBpZD0iT3V0cHV0Ij5PdXRwdXQgSS9PIGhhbmRsZXJzPC9hPjwvaDM+PHA+QW4gT3V0cHV0IGhhbmRsZXIgPGNvZGU+eG1sT3V0cHV0QnVmZmVyPC9jb2RlPiBpcyBjb21wbGV0ZWx5IHNpbWlsYXIgdG8gYW4KSW5wdXQgb25lIGV4Y2VwdCB0aGUgY2FsbGJhY2tzIGFyZSB3cml0ZSgpIGFuZCBjbG9zZSgpLjwvcD48aDM+PGEgbmFtZT0iZW50aXRpZXMiIGlkPSJlbnRpdGllcyI+VGhlIGVudGl0aWVzIGxvYWRlcjwvYT48L2gzPjxwPlRoZSBlbnRpdHkgbG9hZGVyIHJlc29sdmVzIHJlcXVlc3RzIGZvciBuZXcgZW50aXRpZXMgYW5kIGNyZWF0ZSBpbnB1dHMgZm9yCnRoZSBwYXJzZXIuIENyZWF0aW5nIGFuIGlucHV0IGZyb20gYSBmaWxlbmFtZSBvciBhbiBVUkkgc3RyaW5nIGlzIGRvbmUKdGhyb3VnaCB0aGUgeG1sTmV3SW5wdXRGcm9tRmlsZSgpIHJvdXRpbmUuICBUaGUgZGVmYXVsdCBlbnRpdHkgbG9hZGVyIGRvIG5vdApoYW5kbGUgdGhlIFBVQkxJQyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgKGlmIGFueSkuIFNvIGl0IGp1c3QKY2FsbHMgeG1sTmV3SW5wdXRGcm9tRmlsZSgpIHdpdGggdGhlIFNZU1RFTSBpZGVudGlmaWVyICh3aGljaCBpcyBtYW5kYXRvcnkgaW4KWE1MKS48L3A+PHA+SWYgeW91IHdhbnQgdG8gaG9vayB1cCBhIGNhdGFsb2cgbWVjaGFuaXNtIHRoZW4geW91IHNpbXBseSBuZWVkIHRvCm92ZXJyaWRlIHRoZSBkZWZhdWx0IGVudGl0eSBsb2FkZXIsIGhlcmUgaXMgYW4gZXhhbXBsZTo8L3A+PHByZT4jaW5jbHVkZSAmbHQ7bGlieG1sL3htbElPLmgmZ3Q7Cgp4bWxFeHRlcm5hbEVudGl0eUxvYWRlciBkZWZhdWx0TG9hZGVyID0gTlVMTDsKCnhtbFBhcnNlcklucHV0UHRyCnhtbE15RXh0ZXJuYWxFbnRpdHlMb2FkZXIoY29uc3QgY2hhciAqVVJMLCBjb25zdCBjaGFyICpJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgewogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0OwogICAgY29uc3QgY2hhciAqZmlsZUlEID0gTlVMTDsKICAgIC8qIGxvb2t1cCBmb3IgdGhlIGZpbGVJRCBkZXBlbmRpbmcgb24gSUQgKi8KCiAgICByZXQgPSB4bWxOZXdJbnB1dEZyb21GaWxlKGN0eHQsIGZpbGVJRCk7CiAgICBpZiAocmV0ICE9IE5VTEwpCiAgICAgICAgcmV0dXJuKHJldCk7CiAgICBpZiAoZGVmYXVsdExvYWRlciAhPSBOVUxMKQogICAgICAgIHJldCA9IGRlZmF1bHRMb2FkZXIoVVJMLCBJRCwgY3R4dCk7CiAgICByZXR1cm4ocmV0KTsKfQoKaW50IG1haW4oLi4pIHsKICAgIC4uLgoKICAgIC8qCiAgICAgKiBJbnN0YWxsIG91ciBvd24gZW50aXR5IGxvYWRlcgogICAgICovCiAgICBkZWZhdWx0TG9hZGVyID0geG1sR2V0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoKTsKICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKHhtbE15RXh0ZXJuYWxFbnRpdHlMb2FkZXIpOwoKICAgIC4uLgp9PC9wcmU+PGgzPjxhIG5hbWU9IkV4YW1wbGUyIiBpZD0iRXhhbXBsZTIiPkV4YW1wbGUgb2YgY3VzdG9taXplZCBJL088L2E+PC9oMz48cD5UaGlzIGV4YW1wbGUgY29tZSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly94bWxzb2Z0Lm9yZy9tZXNzYWdlcy8wNzA4Lmh0bWwiPmEKcmVhbCB1c2UgY2FzZTwvYT4sICB4bWxEb2NEdW1wKCkgY2xvc2VzIHRoZSBGSUxFICogcGFzc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbgphbmQgdGhpcyB3YXMgYSBwcm9ibGVtLiBUaGUgPGEgaHJlZj0iaHR0cDovL3htbHNvZnQub3JnL21lc3NhZ2VzLzA3MTEuaHRtbCI+c29sdXRpb248L2E+IHdhcyB0byByZWRlZmluZSBhCm5ldyBvdXRwdXQgaGFuZGxlciB3aXRoIHRoZSBjbG9zaW5nIGNhbGwgZGVhY3RpdmF0ZWQ6PC9wPjxvbD48bGk+Rmlyc3QgZGVmaW5lIGEgbmV3IEkvTyBvdXRwdXQgYWxsb2NhdG9yIHdoZXJlIHRoZSBvdXRwdXQgZG9uJ3QgY2xvc2UKICAgIHRoZSBmaWxlOgogICAgPHByZT54bWxPdXRwdXRCdWZmZXJQdHIKeG1sT3V0cHV0QnVmZmVyQ3JlYXRlT3duKEZJTEUgKmZpbGUsIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcikgewqgoKCgeG1sT3V0cHV0QnVmZmVyUHRyIHJldDsKoKCgoAqgoKCgaWYgKHhtbE91dHB1dENhbGxiYWNrSW5pdGlhbGl6ZWQgPT0gMCkKoKCgoKCgoKB4bWxSZWdpc3RlckRlZmF1bHRPdXRwdXRDYWxsYmFja3MoKTsKCqCgoKBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CqCgoKByZXQgPSB4bWxBbGxvY091dHB1dEJ1ZmZlcihlbmNvZGVyKTsKoKCgoGlmIChyZXQgIT0gTlVMTCkgewqgoKCgoKCgoHJldC0mZ3Q7Y29udGV4dCA9IGZpbGU7CqCgoKCgoKCgcmV0LSZndDt3cml0ZWNhbGxiYWNrID0geG1sRmlsZVdyaXRlOwqgoKCgoKCgoHJldC0mZ3Q7Y2xvc2VjYWxsYmFjayA9IE5VTEw7ICAvKiBObyBjbG9zZSBjYWxsYmFjayAqLwqgoKCgfQqgoKCgcmV0dXJuKHJldCk7Cn0gPC9wcmU+CiAgPC9saT4KICA8bGk+QW5kIHRoZW4gdXNlIGl0IHRvIHNhdmUgdGhlIGRvY3VtZW50OgogICAgPHByZT5GSUxFICpmOwp4bWxPdXRwdXRCdWZmZXJQdHIgb3V0cHV0Owp4bWxEb2NQdHIgZG9jOwppbnQgcmVzOwoKZiA9IC4uLgpkb2MgPSAuLi4uCgpvdXRwdXQgPSB4bWxPdXRwdXRCdWZmZXJDcmVhdGVPd24oZiwgTlVMTCk7CnJlcyA9IHhtbFNhdmVGaWxlVG8ob3V0cHV0LCBkb2MsIE5VTEwpOwogICAgPC9wcmU+CiAgPC9saT4KPC9vbD48cD48YSBocmVmPSJidWdzLmh0bWwiPkRhbmllbCBWZWlsbGFyZDwvYT48L3A+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4K