PGh0bWw+Cgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgo8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNS4wIj4KPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPkZpbGVzeXN0ZW0gVHV0b3JpYWw8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi8uLi8uLi9kb2Mvc3JjL21pbmltYWwuY3NzIj4KPC9oZWFkPgoKPGJvZHk+Cgo8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSIyNzciPgo8YSBocmVmPSIuLi8uLi8uLi8uLi9pbmRleC5odG0iPgo8aW1nIHNyYz0iLi4vLi4vLi4vLi4vYm9vc3QucG5nIiBhbHQ9ImJvb3N0LnBuZyAoNjg5NyBieXRlcykiIGFsaWduPSJtaWRkbGUiIHdpZHRoPSIzMDAiIGhlaWdodD0iODYiIGJvcmRlcj0iMCI+PC9hPjwvdGQ+CiAgICA8dGQgYWxpZ249Im1pZGRsZSI+CiAgICA8Zm9udCBzaXplPSI3Ij5GaWxlc3lzdGVtIFR1dG9yaWFsPC9mb250PgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQ+PGEgaHJlZj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtIj5Cb29zdCBIb21lPC9hPiAmbmJzcDsmbmJzcDsKICAgIDxhIGhyZWY9ImluZGV4Lmh0bSI+TGlicmFyeSBIb21lPC9hPiAmbmJzcDsmbmJzcDsKICAgIDxhIGhyZWY9InJlZmVyZW5jZS5odG1sIj5SZWZlcmVuY2U8L2E+ICZuYnNwOyZuYnNwOwogICAgPGEgaHJlZj0idHV0b3JpYWwuaHRtbCI+VHV0b3JpYWw8L2E+ICZuYnNwOyZuYnNwOwogICAgPGEgaHJlZj0iZmFxLmh0bSI+RkFRPC9hPiAmbmJzcDsmbmJzcDsKICAgIDxhIGhyZWY9InBvcnRhYmlsaXR5X2d1aWRlLmh0bSI+UG9ydGFiaWxpdHk8L2E+ICZuYnNwOyZuYnNwOwogICAgPGEgaHJlZj0idjMuaHRtbCI+VjMgSW50cm88L2E+ICZuYnNwOyZuYnNwOwogICAgPGEgaHJlZj0idjNfZGVzaWduLmh0bWwiPlYzIERlc2lnbjwvYT4gJm5ic3A7Jm5ic3A7CiAgICA8YSBocmVmPSJkZXByZWNhdGVkLmh0bWwiPkRlcHJlY2F0ZWQ8L2E+ICZuYnNwOyZuYnNwOwogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8cD4KICAgICAgPGEgaHJlZj0iI0ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjxicj4KICAgICAgPGEgaHJlZj0iI1ByZWxpbWluYXJpZXMiPlByZWxpbWluYXJpZXM8L2E+PGJyPgogICAgICA8YSBocmVmPSIjUmVwb3J0aW5nLXNpemUiPlJlcG9ydGluZyB0aGUgc2l6ZSBvZiBhIGZpbGUgLSAodHV0MS5jcHApPC9hPjxicj4KICAgICAgPGEgaHJlZj0iI1VzaW5nLXN0YXR1cy1xdWVyaWVzIj5Vc2luZyBzdGF0dXMgcXVlcmllcyB0byBkZXRlcm1pbmUgZmlsZSBleGlzdGVuY2UgYW5kIHR5cGUgLSAodHV0Mi5jcHApPC9hPjxicj4KICAgICAgPGEgaHJlZj0iI0RpcmVjdG9yeS1pdGVyYXRpb24iPkRpcmVjdG9yeSBpdGVyYXRpb24gcGx1cyBjYXRjaGluZyAKICAgICAgZXhjZXB0aW9ucyAtICh0dXQzLmNwcCk8L2E+PGJyPgogICAgICA8YSBocmVmPSIjVXNpbmctcGF0aC1kZWNvbXBvc2l0aW9uIj5Vc2luZyBwYXRoIGRlY29tcG9zaXRpb24sIHBsdXMgc29ydGluZyByZXN1bHRzIC0gKHR1dDQuY3BwKTwvYT48YnI+CiAgICAgIDxhIGhyZWY9IiNDbGFzcy1wYXRoLUNvbnN0cnVjdG9ycyI+Q2xhc3MgcGF0aDogQ29uc3RydWN0b3JzLCBpbmNsdWRpbmcgCiAgICAgIFVuaWNvZGUgLSAodHV0NS5jcHApPC9hPjxicj4KICAgICAgPGEgaHJlZj0iI0NsYXNzLXBhdGgtZm9ybWF0cyI+Q2xhc3MgcGF0aDogR2VuZXJpYyBmb3JtYXQgdnMuIE5hdGl2ZSBmb3JtYXQ8L2E+PGJyPgogICAgICA8YSBocmVmPSIjQ2xhc3MgcGF0aC1pdGVyYXRvcnMtZXRjIj5DbGFzcyBwYXRoOiBJdGVyYXRvcnMsIG9ic2VydmVycywgY29tcG9zaXRpb24sIGRlY29tcG9zaXRpb24sIGFuZCBxdWVyeSAtIChwYXRoX2luZm8uY3BwKTwvYT48YnI+CiAgICAgIDxhIGhyZWY9IiNFcnJvci1yZXBvcnRpbmciPkVycm9yIHJlcG9ydGluZzwvYT48YnI+CjwvcD4KPGgyPjxhIG5hbWU9IkludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Cgo8cD5UaGlzIHR1dG9yaWFsIGRldmVsb3BzIGEgbGl0dGxlIGNvbW1hbmQgbGluZSBwcm9ncmFtIHRvIGxpc3QgaW5mb3JtYXRpb24gCmFib3V0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyAtIGVzc2VudGlhbGx5IGEgbXVjaCBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIFBPU0lYIDxjb2RlPmxzPC9jb2RlPiBvciBXaW5kb3dzIDxjb2RlPmRpcjwvY29kZT4gCmNvbW1hbmRzLiBXZSdsbCBzdGFydCB3aXRoIHRoZSBzaW1wbGVzdCBwb3NzaWJsZSB2ZXJzaW9uIGFuZCBwcm9ncmVzcyB0byBtb3JlIApjb21wbGV4IGZ1bmN0aW9uYWxpdHkuIEFsb25nIHRoZSB3YXkgd2UnbGwgZGlncmVzcyB0byBjb3ZlciB0b3BpY3MgeW91J2xsIG5lZWQgCnRvIGtub3cgYWJvdXQgdG8gdW5kZXJzdGFuZCBCb29zdC5GaWxlc3lzdGVtLjwvcD4KCjxwPlNvdXJjZSBjb2RlIGZvciBlYWNoICBvZiB0aGUgdHV0b3JpYWwgcHJvZ3JhbXMgaXMgYXZhaWxhYmxlLCBhbmQgeW91IAphcmUgZW5jb3VyYWdlZCB0byBjb21waWxlLCB0ZXN0LCBhbmQgZXhwZXJpbWVudCB3aXRoIGl0LiBUbyBjb25zZXJ2ZSBzcGFjZSwgd2Ugd29uJ3QgCmFsd2F5cyBzaG93IGJvaWxlcnBsYXRlIGNvZGUgaGVyZSwgYnV0IHRoZSBwcm92aWRlZCBzb3VyY2UgaXMgY29tcGxldGUgYW5kIApyZWFkeSB0byBidWlsZC48L3A+Cgo8aDI+PGEgbmFtZT0iUHJlbGltaW5hcmllcyI+UHJlbGltaW5hcmllczwvYT48L2gyPgoKPHA+SW5zdGFsbCB0aGUgQm9vc3QgZGlzdHJpYnV0aW9uIGlmIHlvdSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gU2VlIHRoZQo8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9tb3JlL2dldHRpbmdfc3RhcnRlZC9pbmRleC5odG1sIj5Cb29zdCBHZXR0aW5nIApTdGFydGVkPC9hPiBkb2NzLjwvcD4KCjxwPlRoaXMgdHV0b3JpYWwgYXNzdW1lcyB5b3UgYXJlIGdvaW5nIHRvIGNvbXBpbGUgYW5kIHRlc3QgdGhlIGV4YW1wbGVzIHVzaW5nIAp0aGUgcHJvdmlkZWQgc2NyaXB0cy4gVGhhdCdzIGhpZ2hseSByZWNvbW1lbmRlZC48L3A+Cgo8YmxvY2txdW90ZT4KCjxwPjxiPklmIHlvdSBhcmUgcGxhbm5pbmcgdG8gY29tcGlsZSBhbmQgdGVzdCB0aGUgZXhhbXBsZXMgYnV0IG5vdCB1c2UgdGhlIApzY3JpcHRzLCBtYWtlIHN1cmUgeW91ciBidWlsZCBzZXR1cCBrbm93cyB3aGVyZSB0byAKbG9jYXRlIG9yIGJ1aWxkIHRoZSBCb29zdCBsaWJyYXJ5IGJpbmFyaWVzLjwvYj48L3A+Cgo8L2Jsb2NrcXVvdGU+CjxwPkZpcmUgdXAgeW91ciBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIsIGFuZCB0eXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICAgIDxwcmU+JCBjZCA8aT48Yj5ib29zdC1yb290PC9iPjwvaT4vbGlicy9maWxlc3lzdGVtL2V4YW1wbGUvdGVzdAokIC4vc2V0dXAKJCAuL2JsZAokIC4vdHV0MQpVc2FnZTogdHV0MSBwYXRoPC9wcmU+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT4mZ3Q7Y2QgPGk+PGI+Ym9vc3Qtcm9vdDwvYj48L2k+XGxpYnNcZmlsZXN5c3RlbVxleGFtcGxlXHRlc3QKJmd0O3NldHVwCiZndDtibGQKJmd0O3R1dDEKVXNhZ2U6IHR1dDEgcGF0aDwvcHJlPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHA+SWYgdGhlIDxjb2RlPnR1dDE8L2NvZGU+IGNvbW1hbmQgb3V0cHV0cyAmcXVvdDs8Y29kZT5Vc2FnZTogdHV0MSBwYXRoPC9jb2RlPiZxdW90OywgYWxsIAppcyB3ZWxsLiBBIHNldCBvZiB0dXRvcmlhbCBwcm9ncmFtcyBoYXMgYmVlbiBjb3BpZWQgKGJ5IDxjb2RlPnNldHVwPC9jb2RlPikgdG8KPGk+PGI+PGNvZGU+Ym9vc3Qtcm9vdDwvY29kZT48L2I+PC9pPjxjb2RlPi9saWJzL2ZpbGVzeXN0ZW0vZXhhbXBsZS90ZXN0PC9jb2RlPiAKYW5kIHRoZW4gYnVpbHQuIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBtb2RpZnkgYW5kIGV4cGVyaW1lbnQgd2l0aCB0aGVtIGFzIHRoZSAKdHV0b3JpYWwgcHJvZ3Jlc3Nlcy4gSnVzdCBpbnZva2UgdGhlIDxjb2RlPmJsZDwvY29kZT4gc2NyaXB0IGFnYWluIHRvIHJlYnVpbGQuPC9wPgoKPHA+SWYgc29tZXRoaW5nIGRpZG4ndCB3b3JrIHJpZ2h0LCBoZXJlIGFyZSB0cm91Ymxlc2hvb3Rpbmcgc3VnZ2VzdGlvbnM6PC9wPgoKICA8dWw+CiAgICA8bGk+VGhlIDxjb2RlPmJqYW08L2NvZGU+IHByb2dyYW0gZXhlY3V0YWJsZSBpc24ndCBiZWluZyBmb3VuZC4gCiAgICBDaGVjayB5b3VyIHBhdGggZW52aXJvbm1lbnRhbCB2YXJpYWJsZSBpZiBpdCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kLCAKICAgIG90aGVyd2lzZSBzZWUKICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL21vcmUvZ2V0dGluZ19zdGFydGVkL3dpbmRvd3MuaHRtbCI+Qm9vc3QgCiAgICBHZXR0aW5nIFN0YXJ0ZWQ8L2E+Ljxicj4KJm5ic3A7PC9saT4KICAgIDxsaT5Mb29rIGF0IDxjb2RlPmJqYW0ubG9nPC9jb2RlPiB0byB0cnkgdG8gc3BvdCBhbiBpbmRpY2F0aW9uIG9mIHRoZSAKICAgIHByb2JsZW0uPC9saT4KICA8L3VsPgoKPGgyPjxhIG5hbWU9IlJlcG9ydGluZy1zaXplIj5SZXBvcnRpbmcgdGhlIHNpemUgb2YgYSBmaWxlPC9hPiAtICg8YSBocmVmPSIuLi9leGFtcGxlL3R1dDEuY3BwIj50dXQxLmNwcDwvYT4pPC9oMj4KCjxwPkxldCdzIGdldCBzdGFydGVkLiBPbmUgb2YgdGhlIHNpbXBsZXN0IHRoaW5ncyB3ZSBjYW4gZG8gaXMgcmVwb3J0IHRoZSBzaXplIG9mIAphIGZpbGUuPC9wPgoKPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSI5MCUiPgogIDx0cj4KICAgIDx0ZCBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgIDxwcmU+PGEgaHJlZj0iLi4vZXhhbXBsZS90dXQxLmNwcCI+dHV0MS5jcHA8L2E+PC9wcmU+CiAgICA8YmxvY2txdW90ZSBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT4jaW5jbHVkZSAmbHQ7aW9zdHJlYW0mZ3Q7CiNpbmNsdWRlICZsdDtib29zdC9maWxlc3lzdGVtLmhwcCZndDsKdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpmaWxlc3lzdGVtOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogIGlmIChhcmdjICZsdDsgMikKICB7CiAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgJnF1b3Q7VXNhZ2U6IHR1dDEgcGF0aFxuJnF1b3Q7OwogICAgcmV0dXJuIDE7CiAgfQogIHN0ZDo6Y291dCAmbHQ7Jmx0OyBhcmd2WzFdICZsdDsmbHQ7ICZxdW90OyAmcXVvdDsgJmx0OyZsdDsgZmlsZV9zaXplKGFyZ3ZbMV0pICZsdDsmbHQ7ICdcbic7CiAgcmV0dXJuIDA7Cn08L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjxwPlRoZSBCb29zdC5GaWxlc3lzdGVtIDxjb2RlPjxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2ZpbGVfc2l6ZSI+ZmlsZV9zaXplPC9hPjwvY29kZT4gCmZ1bmN0aW9uIHJldHVybnMgYSA8Y29kZT51aW50bWF4X3Q8L2NvZGU+IApjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSBmaWxlIG5hbWVkIGJ5IHRoZSBhcmd1bWVudC4gVGhlIGRlY2xhcmF0aW9uIGxvb2tzIApsaWtlIHRoaXM6PC9wPgoKPGJsb2NrcXVvdGU+CiAgPHByZT48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgIj51aW50bWF4X3Q8L3NwYW4+IDxhIG5hbWU9ImZpbGVfc2l6ZSI+ZmlsZV9zaXplPC9hPihjb25zdCBwYXRoJmFtcDsgcCk7PC9wcmU+CjwvYmxvY2txdW90ZT4KPHA+Rm9yIG5vdywgYWxsIHlvdSBuZWVkIHRvIGtub3cgaXMgdGhhdCBjbGFzcyBwYXRoIGhhcyBjb25zdHJ1Y3RvcnMgdGhhdCB0YWtlCjxjb2RlPmNvbnN0IGNoYXIgKjwvY29kZT4gYW5kIG1hbnkgb3RoZXIgdXNlZnVsIHR5cGVzLiAoSWYgeW91IGNhbid0IHdhaXQgdG8gCmZpbmQgb3V0IG1vcmUsIHNraXAgYWhlYWQgdG8gdGhlIDxhIGhyZWY9IiNDbGFzcy1wYXRoLUNvbnN0cnVjdG9ycyI+Y2xhc3MgcGF0aDwvYT4gc2VjdGlvbiBvZiAKdGhlIHR1dG9yaWFsLik8L3A+CjxwPlBsZWFzZSB0YWtlIGEgbWludXRlIHRvIHRyeSBvdXQgPGNvZGU+dHV0MTwvY29kZT4gb24geW91ciBzeXN0ZW0sIHVzaW5nIGEgCmZpbGUgdGhhdCBpcyBrbm93biB0byBleGlzdCwgc3VjaCBhcyA8Y29kZT50dXQxLmNwcDwvY29kZT4uIEhlcmUgaXMgd2hhdCB0aGUgCnJlc3VsdHMgbG9vayBsaWtlIG9uIHR3byBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXM6PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiQgLi90dXQxIHR1dDEuY3BwCnR1dDEuY3BwIDU2OTwvcHJlPgogICAgICA8cHJlPiQgbHMgLWwgdHV0MS5jcHAKLXJ3eHJ3eHJ3eCAxIHJvb3Qgcm9vdCA1NjkgMjAxMC0wMi0wMSAwNzozMSB0dXQxLmNwcDwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiZndDt0dXQxIHR1dDEuY3BwCnR1dDEuY3BwIDU5MgomZ3Q7ZGlyIHR1dDEuY3BwCi4uLgowMS8zMC8yMDEwIDEwOjQ3IEFNIDU5MiB0dXQxLmNwcAouLi48L3ByZT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KCjxwPlNvIGZhciwgc28gZ29vZC4gVGhlIHJlcG9ydGVkIExpbnV4IGFuZCBXaW5kb3dzIHNpemVzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSAKdGhlIExpbnV4IHRlc3RzIHVzZWQgPGNvZGU+JnF1b3Q7XG4mcXVvdDs8L2NvZGU+IGxpbmUgZW5kaW5ncywgd2hpbGUgdGhlIFdpbmRvd3MgdGVzdHMgCnVzZWQgPGNvZGU+JnF1b3Q7XHJcbiZxdW90OzwvY29kZT4gbGluZSBlbmRpbmdzLjwvcD4KICA8cD5Ob3cgdHJ5IGFnYWluLCBidXQgZ2l2ZSBhIHBhdGggdGhhdCBkb2Vzbid0IGV4aXN0OjwvcD4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIgogICAgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPlVidW50dSBMaW51eCA8L2I+PC9pPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5NaWNyb3NvZnQgV2luZG93czwvYj48L2k+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0IiB2YWxpZ249InRvcCI+CiAgICAgIDxwcmU+JCAuL3R1dDEgZm9vCnRlcm1pbmF0ZSBjYWxsZWQgYWZ0ZXIgdGhyb3dpbmcgYW4gaW5zdGFuY2Ugb2YgJ2Jvb3N0OjpleGNlcHRpb25fZGV0YWlsOjoKY2xvbmVfaW1wbCZsdDtib29zdDo6ZXhjZXB0aW9uX2RldGFpbDo6ZXJyb3JfaW5mb19pbmplY3RvciZsdDtib29zdDo6CmZpbGVzeXN0ZW06OmZpbGVzeXN0ZW1fZXJyb3ImZ3Q7ICZndDsnCiAgd2hhdCgpOiBib29zdDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAmcXVvdDtmb28mcXVvdDsKQWJvcnRlZDwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiZndDt0dXQxIGZvbzwvcHJlPgogICAgICA8cD48Yj48aT5BbiBleGNlcHRpb24gaXMgdGhyb3duOyB0aGUgZXhhY3QgZm9ybSBvZiB0aGUgcmVzcG9uc2UgZGVwZW5kcyBvbiAKICAgICAgV2luZG93cyBzeXN0ZW0gb3B0aW9ucy48L2k+PC9iPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CgogIDxwPldoYXQgaGFwcGVucz8KICBUaGVyZSdzIG5vIGZpbGUgbmFtZWQgPGNvZGU+Zm9vPC9jb2RlPiBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHNvIGFuIApleGNlcHRpb24gaXMgdGhyb3duLjwvcD4KICA8cD5UcnkgdGhpczo8L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPlVidW50dSBMaW51eCA8L2I+PC9pPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5NaWNyb3NvZnQgV2luZG93czwvYj48L2k+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT4kIC4vdHV0MSAuCnRlcm1pbmF0ZSBjYWxsZWQgYWZ0ZXIgdGhyb3dpbmcgYW4gaW5zdGFuY2Ugb2YgJ2Jvb3N0OjpleGNlcHRpb25fZGV0YWlsOjoKY2xvbmVfaW1wbCZsdDtib29zdDo6ZXhjZXB0aW9uX2RldGFpbDo6ZXJyb3JfaW5mb19pbmplY3RvciZsdDtib29zdDo6CmZpbGVzeXN0ZW06OmZpbGVzeXN0ZW1fZXJyb3ImZ3Q7ICZndDsnCiAgd2hhdCgpOiBib29zdDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplOiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAmcXVvdDsuJnF1b3Q7CkFib3J0ZWQ8L3ByZT4KICAgICAgPC90ZD4KICAgICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiIHZhbGlnbj0idG9wIj4KICAgICAgPHByZT4mZ3Q7dHV0MSAuPC9wcmU+CiAgICAgIDxwPjxiPjxpPkFuIGV4Y2VwdGlvbiBpcyB0aHJvd247IHRoZSBleGFjdCBmb3JtIG9mIHRoZSByZXNwb25zZSBkZXBlbmRzIG9uIAogICAgICBXaW5kb3dzIHN5c3RlbSBvcHRpb25zLjwvaT48L2I+PC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KCiAgPHA+VGhlIGN1cnJlbnQgZGlyZWN0b3J5IGV4aXN0cywgYnV0IDxjb2RlPmZpbGVfc2l6ZSgpPC9jb2RlPiB3b3JrcyBvbiByZWd1bGFyIAogIGZpbGVzLCBub3QgZGlyZWN0b3JpZXMsIHNvIGFnYWluLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLjwvcD4KCiAgPHA+V2UnbGwgZGVhbCB3aXRoIHRob3NlIHNpdHVhdGlvbnMgaW4gPGNvZGU+dHV0Mi5jcHA8L2NvZGU+LjwvcD4KCjxoMj48YSBuYW1lPSJVc2luZy1zdGF0dXMtcXVlcmllcyI+VXNpbmcgc3RhdHVzIHF1ZXJpZXMgdG8gZGV0ZXJtaW5lIGZpbGUgZXhpc3RlbmNlIGFuZCB0eXBlPC9hPiAtICg8YSBocmVmPSIuLi9leGFtcGxlL3R1dDIuY3BwIj50dXQyLmNwcDwvYT4pPC9oMj4KCjxwPkJvb3N0LkZpbGVzeXN0ZW0gaW5jbHVkZXMgc3RhdHVzIHF1ZXJ5IGZ1bmN0aW9ucyBzdWNoIGFzIDxjb2RlPgo8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNleGlzdHMtcGF0aCI+ZXhpc3RzPC9hPjwvY29kZT4sCjxjb2RlPjxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2lzX2RpcmVjdG9yeS1wYXRoIj5pc19kaXJlY3Rvcnk8L2E+PC9jb2RlPiwgYW5kIDxjb2RlPgo8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNpc19yZWd1bGFyX2ZpbGUtcGF0aCI+aXNfcmVndWxhcl9maWxlPC9hPjwvY29kZT4uIFRoZXNlIHJldHVybgo8Y29kZT5ib29sPC9jb2RlPidzLCBhbmQgd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmRpdGlvbiAKZGVzY3JpYmVkIGJ5IHRoZWlyIG5hbWUgaXMgbWV0LiBPdGhlcndpc2UgdGhleSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCAKaW5jbHVkaW5nIHdoZW4gYW55IGVsZW1lbnQgCm9mIHRoZSBwYXRoIGFyZ3VtZW50IGNhbid0IGJlIGZvdW5kLjwvcD4KCjxwPnR1dDIuY3BwIHVzZXMgc2V2ZXJhbCBvZiB0aGUgc3RhdHVzIHF1ZXJ5IGZ1bmN0aW9ucyB0byBjb3BlIHdpdGggbm9uLWV4aXN0ZW50IApmaWxlcyBhbmQgd2l0aCBkaWZmZXJlbnQga2luZHMgb2YgZmlsZXM6PC9wPgoKPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSI5MCUiPgogIDx0cj4KICAgIDx0ZCBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgIDxwcmU+PGEgaHJlZj0iLi4vZXhhbXBsZS90dXQyLmNwcCI+dHV0Mi5jcHA8L2E+PC9wcmU+CiAgICA8YmxvY2txdW90ZSBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT5pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjY2xhc3MtcGF0aCI+cGF0aDwvYT4gcCAoYXJndlsxXSk7ICAgLy8gcCByZWFkcyBjbGVhcmVyIHRoYW4gYXJndlsxXSBpbiB0aGUgZm9sbG93aW5nIGNvZGUKCiAgaWYgKDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2V4aXN0cy1wYXRoIj5leGlzdHM8L2E+KHApKSAgICAvLyBkb2VzIHAgYWN0dWFsbHkgZXhpc3Q/CiAgewogICAgaWYgKDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2lzX3JlZ3VsYXJfZmlsZS1wYXRoIj5pc19yZWd1bGFyX2ZpbGU8L2E+KHApKSAgICAgICAgLy8gaXMgcCBhIHJlZ3VsYXIgZmlsZT8gICAKICAgICAgY291dCAmbHQ7Jmx0OyBwICZsdDsmbHQ7ICZxdW90OyBzaXplIGlzICZxdW90OyAmbHQ7Jmx0OyA8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNmaWxlX3NpemUiPmZpbGVfc2l6ZTwvYT4ocCkgJmx0OyZsdDsgJ1xuJzsKCiAgICBlbHNlIGlmICg8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNpc19kaXJlY3RvcnktcGF0aCI+aXNfZGlyZWN0b3J5PC9hPihwKSkgICAgICAvLyBpcyBwIGEgZGlyZWN0b3J5PwogICAgICBjb3V0ICZsdDsmbHQ7IHAgJmx0OyZsdDsgJnF1b3Q7aXMgYSBkaXJlY3RvcnlcbiZxdW90OzsKCiAgICBlbHNlCiAgICAgIGNvdXQgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDtleGlzdHMsIGJ1dCBpcyBuZWl0aGVyIGEgcmVndWxhciBmaWxlIG5vciBhIGRpcmVjdG9yeVxuJnF1b3Q7OwogIH0KICBlbHNlCiAgICBjb3V0ICZsdDsmbHQ7IHAgJmx0OyZsdDsgJnF1b3Q7ZG9lcyBub3QgZXhpc3RcbiZxdW90OzsKCiAgcmV0dXJuIDA7Cn08L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjxwPkdpdmUgaXQgYSB0cnk6PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiQgLi90dXQyIHR1dDIuY3BwCnR1dDIgc2l6ZSBpcyBjcHAgMTAzNwokIC4vdHV0MiBmb28KZm9vIGRvZXMgbm90IGV4aXN0CiQgLi90dXQyIC4KLiBpcyBhIGRpcmVjdG9yeTwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiZndDt0dXQyIHR1dDIuY3BwCnR1dDIuY3BwIHNpemUgaXMgMTA3OQoKJmd0O3R1dDIgZm9vCmZvbyBkb2VzIG5vdCBleGlzdAoKJmd0O3R1dDIgLgouIGlzIGEgZGlyZWN0b3J5PC9wcmU+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cgo8cD5BbHRob3VnaCB0dXQyIHdvcmtzIE9LIGluIHRoZXNlIHRlc3RzLCB0aGUgb3V0cHV0IGlzIGxlc3MgdGhhbiBzYXRpc2ZhY3RvcnkgCmZvciBhIGRpcmVjdG9yeS4gV2UnZCB0eXBpY2FsbHkgbGlrZSB0byBzZWUgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcnkncyBjb250ZW50cy4gSW4gPGNvZGU+dHV0My5jcHA8L2NvZGU+IAp3ZSB3aWxsIHNlZSBob3cgdG8gaXRlcmF0ZSBvdmVyIGRpcmVjdG9yaWVzLjwvcD4KCjxwPkJ1dCBmaXJzdCwgbGV0J3MgdHJ5IG9uZSBtb3JlIHRlc3Q6PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiQgbHMgL2hvbWUvamFuZS9mb28KbHM6IGNhbm5vdCBhY2Nlc3MgL2hvbWUvamFuZS9mb286IFBlcm1pc3Npb24gZGVuaWVkCiQgLi90dXQyIC9ob21lL2phbmUvZm9vCnRlcm1pbmF0ZSBjYWxsZWQgYWZ0ZXIgdGhyb3dpbmcgYW4gaW5zdGFuY2Ugb2YgJ2Jvb3N0OjpleGNlcHRpb25fZGV0YWlsOjoKY2xvbmVfaW1wbCZsdDtib29zdDo6ZXhjZXB0aW9uX2RldGFpbDo6ZXJyb3JfaW5mb19pbmplY3RvciZsdDtib29zdDo6CmZpbGVzeXN0ZW06OmZpbGVzeXN0ZW1fZXJyb3ImZ3Q7ICZndDsnCiAgIHdoYXQoKTogYm9vc3Q6OmZpbGVzeXN0ZW06OnN0YXR1czogUGVybWlzc2lvbiBkZW5pZWQ6CiAgICAgJnF1b3Q7L2hvbWUvamFuZS9mb28mcXVvdDsKQWJvcnRlZDwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiZndDtkaXIgZTpcClRoZSBkZXZpY2UgaXMgbm90IHJlYWR5LgomZ3Q7dHV0MiBlOlw8L3ByZT4KICAgICAgPHA+PGI+PGk+QW4gZXhjZXB0aW9uIGlzIHRocm93bjsgdGhlIGV4YWN0IGZvcm0gb2YgdGhlIHJlc3BvbnNlIGRlcGVuZHMgb24gCiAgICAgIFdpbmRvd3Mgc3lzdGVtIG9wdGlvbnMuPC9pPjwvYj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHA+T24gdGhlIExpbnV4IHN5c3RlbSwgdGhlIHRlc3Qgd2FzIGJlaW5nIHJ1biBmcm9tIGFuIGFjY291bnQgdGhhdCBkaWQgbm90IGhhdmUgCnBlcm1pc3Npb24gdG8gYWNjZXNzIDxjb2RlPi9ob21lL2phbmUvZm9vPC9jb2RlPi4gT24gdGhlIFdpbmRvd3Mgc3lzdGVtLCA8Y29kZT4KZTo8L2NvZGU+IHdhcyBhIENvbXBhY3QgRGlzYyByZWFkZXIvd3JpdGVyIHRoYXQgd2FzIG5vdCByZWFkeS4gRW5kIHVzZXJzIApzaG91bGRuJ3QgaGF2ZSB0byBpbnRlcnByZXQgY3J5cHRpYyBleGNlcHRpb25zIHJlcG9ydHMsIHNvIGFzIHdlIG1vdmUgb24gdG8gPGNvZGU+dHV0My5jcHA8L2NvZGU+IAp3ZSB3aWxsIGluY3JlYXNlIHRoZSByb2J1c3RuZXNzIG9mIHRoZSBjb2RlLCB0b28uPC9wPgoKPGgyPjxhIG5hbWU9IkRpcmVjdG9yeS1pdGVyYXRpb24iPkRpcmVjdG9yeSBpdGVyYXRpb248L2E+IHBsdXMgY2F0Y2hpbmcgCmV4Y2VwdGlvbnMgLSAoPGEgaHJlZj0iLi4vZXhhbXBsZS90dXQzLmNwcCI+dHV0My5jcHA8L2E+KTwvaDI+Cgo8cD5Cb29zdC5GaWxlc3lzdGVtJ3MgPGNvZGU+PGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjZGlyZWN0b3J5X2l0ZXJhdG9yIj4KZGlyZWN0b3J5X2l0ZXJhdG9yPC9hPjwvY29kZT4gY2xhc3MgaXMganVzdCB3aGF0IHdlIG5lZWQgaGVyZS4gSXQgZm9sbG93cyB0aGUgCmdlbmVyYWwgcGF0dGVybiBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSdzIDxjb2RlPmlzdHJlYW1faXRlcmF0b3I8L2NvZGU+LiBDb25zdHJ1Y3RlZCBmcm9tIAphIHBhdGgsIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkuIEEgZGVmYXVsdCBjb25zdHJ1Y3RlZCA8Y29kZT5kaXJlY3RvcnlfaXRlcmF0b3I8L2NvZGU+IAphY3RzIGFzIHRoZSBlbmQgaXRlcmF0b3IuPC9wPgoKPHA+VGhlIHZhbHVlIHR5cGUgb2YgPGNvZGU+ZGlyZWN0b3J5X2l0ZXJhdG9yPC9jb2RlPiBpcyA8Y29kZT4KPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjZGlyZWN0b3J5X2VudHJ5Ij5kaXJlY3RvcnlfZW50cnk8L2E+PC9jb2RlPi4gQSA8Y29kZT4KZGlyZWN0b3J5X2VudHJ5PC9jb2RlPiBvYmplY3QgY29udGFpbnMgYSA8Y29kZT5wYXRoPC9jb2RlPiBhbmQgPGNvZGU+PGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjZmlsZV9zdGF0dXMiPmZpbGVfc3RhdHVzPC9hPjwvY29kZT4gCmluZm9ybWF0aW9uLiZuYnNwOyBBIDxjb2RlPgpkaXJlY3RvcnlfZW50cnk8L2NvZGU+IG9iamVjdCAKY2FuIGJlIHVzZWQgZGlyZWN0bHksIGJ1dCBjYW4gYWxzbyBiZSBwYXNzZWQgdG8gPGNvZGU+cGF0aDwvY29kZT4gYXJndW1lbnRzIGluIGZ1bmN0aW9uIGNhbGxzLjwvcD4KCjxwPlRoZSBvdGhlciBuZWVkIGlzIGluY3JlYXNlZCByb2J1c3RuZXNzIGluIHRoZSBmYWNlIG9mIHRoZSBtYW55IGtpbmRzIG9mIAplcnJvcnMgdGhhdCBjYW4gYWZmZWN0IGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuIFdlIGNvdWxkIGRvIHRoYXQgYXQgdGhlIGxldmVsIG9mIAplYWNoIGNhbGwgdG8gYSBCb29zdC5GaWxlc3lzdGVtIGZ1bmN0aW9uIChzZWUgPGEgaHJlZj0iI0Vycm9yLXJlcG9ydGluZyI+RXJyb3IgCnJlcG9ydGluZzwvYT4pLCBidXQgaXQgaXMgZWFzaWVyIHRvIHN1cHBseSBhbiBvdmVyYWxsIHRyeS9jYXRjaCBibG9jay48L3A+Cgo8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgPHRyPgogICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgPHByZT48YSBocmVmPSIuLi9leGFtcGxlL3R1dDMuY3BwIj50dXQzLmNwcDwvYT48L3ByZT4KICAgIDxibG9ja3F1b3RlPgogICAgICA8cHJlPmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICA8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNjbGFzcy1wYXRoIj5wYXRoPC9hPiBwIChhcmd2WzFdKTsgICAvLyBwIHJlYWRzIGNsZWFyZXIgdGhhbiBhcmd2WzFdIGluIHRoZSBmb2xsb3dpbmcgY29kZQoKICB0cnkKICB7CiAgICBpZiAoPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjZXhpc3RzLXBhdGgiPmV4aXN0czwvYT4ocCkpICAgIC8vIGRvZXMgcCBhY3R1YWxseSBleGlzdD8KICAgIHsKICAgICAgaWYgKDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2lzX3JlZ3VsYXJfZmlsZS1wYXRoIj5pc19yZWd1bGFyX2ZpbGU8L2E+KHApKSAgICAgICAgLy8gaXMgcCBhIHJlZ3VsYXIgZmlsZT8gICAKICAgICAgICBjb3V0ICZsdDsmbHQ7IHAgJmx0OyZsdDsgJnF1b3Q7IHNpemUgaXMgJnF1b3Q7ICZsdDsmbHQ7IDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2ZpbGVfc2l6ZSI+ZmlsZV9zaXplPC9hPihwKSAmbHQ7Jmx0OyAnXG4nOwoKICAgICAgZWxzZSBpZiAoPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjaXNfZGlyZWN0b3J5LXBhdGgiPmlzX2RpcmVjdG9yeTwvYT4ocCkpICAgICAgLy8gaXMgcCBhIGRpcmVjdG9yeT8KICAgICAgewogICAgICAgIGNvdXQgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDsgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZzpcbiZxdW90OzsKCiAgICAgICAgY29weShkaXJlY3RvcnlfaXRlcmF0b3IocCksIGRpcmVjdG9yeV9pdGVyYXRvcigpLCAvLyBkaXJlY3RvcnlfaXRlcmF0b3I6OnZhbHVlX3R5cGUKICAgICAgICAgIG9zdHJlYW1faXRlcmF0b3ImbHQ7ZGlyZWN0b3J5X2VudHJ5Jmd0Oyhjb3V0LCAmcXVvdDtcbiZxdW90OykpOyAvLyBpcyBkaXJlY3RvcnlfZW50cnksIHdoaWNoIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ZWQgdG8gYSBwYXRoIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBzdHJlYW0gaW5zZXJ0ZXIKICAgICAgfQoKICAgICAgZWxzZQogICAgICAgIGNvdXQgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDsgZXhpc3RzLCBidXQgaXMgbmVpdGhlciBhIHJlZ3VsYXIgZmlsZSBub3IgYSBkaXJlY3RvcnlcbiZxdW90OzsKICAgIH0KICAgIGVsc2UKICAgICAgY291dCAmbHQ7Jmx0OyBwICZsdDsmbHQ7ICZxdW90OyBkb2VzIG5vdCBleGlzdFxuJnF1b3Q7OwogIH0KCiAgY2F0Y2ggKGNvbnN0IGZpbGVzeXN0ZW1fZXJyb3ImYW1wOyBleCkKICB7CiAgICBjb3V0ICZsdDsmbHQ7IGV4LndoYXQoKSAmbHQ7Jmx0OyAnXG4nOwogIH0KCiAgcmV0dXJuIDA7Cn08L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjxwPkdpdmUgPGNvZGU+dHV0MzwvY29kZT4gYSB0cnksIHBhc3NpbmcgaXQgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IGFzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAKSGVyZSBpcyBhIHJ1biBvbiBhIGNoZWNrb3V0IG9mIHRoZSBCb29zdCBTdWJ2ZXJzaW9uIHRydW5rLCBmb2xsb3dlZCBieSBhIHJlcGVhdCAKb2YgdGhlIHRlc3QgY2FzZXMgdGhhdCBjYXVzZWQgZXhjZXB0aW9ucyBvbiBMaW51eCBhbmQgV2luZG93czo8L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPlVidW50dSBMaW51eCA8L2I+PC9pPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5NaWNyb3NvZnQgV2luZG93czwvYj48L2k+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0IiB2YWxpZ249InRvcCI+CiAgICAgIDxwcmU+JCAuL3R1dDMgfi9ib29zdC90cnVuawovaG9tZS9iZW1hbi9ib29zdC90cnVuayBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nOgogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL3Rvb2xzCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvYm9vc3QtYnVpbGQuamFtCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvZGlzdAogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL2RvYwogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL2Jvb3RzdHJhcC5zaAogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL2luZGV4Lmh0bWwKICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9ib290c3RyYXAuYmF0CiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvYm9vc3QuY3NzCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvSU5TVEFMTAogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL3JzdC5jc3MKICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9ib29zdAogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL3Blb3BsZQogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL3dpa2kKICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9ib29zdC5wbmcKICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9MSUNFTlNFXzFfMC50eHQKICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9tb3JlCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvSmFtcm9vdAogIC9ob21lL2JlbWFuL2Jvb3N0L3RydW5rLy5zdm4KICAvaG9tZS9iZW1hbi9ib29zdC90cnVuay9saWJzCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvaW5kZXguaHRtCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvc3RhdHVzCiAgL2hvbWUvYmVtYW4vYm9vc3QvdHJ1bmsvQ01ha2VMaXN0cy50eHQ8L3ByZT4KICAgICAgPC90ZD4KICAgICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiIHZhbGlnbj0idG9wIj4KICAgICAgPHByZT4mZ3Q7dHV0MyBjOlxib29zdFx0cnVuawpjOlxib29zdFx0cnVuayBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nOgogICBjOlxib29zdFx0cnVua1wuc3ZuCiAgIGM6XGJvb3N0XHRydW5rXGJvb3N0CiAgIGM6XGJvb3N0XHRydW5rXGJvb3N0LWJ1aWxkLmphbQogICBjOlxib29zdFx0cnVua1xib29zdC5jc3MKICAgYzpcYm9vc3RcdHJ1bmtcYm9vc3QucG5nCiAgIGM6XGJvb3N0XHRydW5rXGJvb3RzdHJhcC5iYXQKICAgYzpcYm9vc3RcdHJ1bmtcYm9vdHN0cmFwLnNoCiAgIGM6XGJvb3N0XHRydW5rXENNYWtlTGlzdHMudHh0CiAgIGM6XGJvb3N0XHRydW5rXGRpc3QKICAgYzpcYm9vc3RcdHJ1bmtcZG9jCiAgIGM6XGJvb3N0XHRydW5rXGluZGV4Lmh0bQogICBjOlxib29zdFx0cnVua1xpbmRleC5odG1sCiAgIGM6XGJvb3N0XHRydW5rXElOU1RBTEwKICAgYzpcYm9vc3RcdHJ1bmtcSmFtcm9vdAogICBjOlxib29zdFx0cnVua1xsaWJzCiAgIGM6XGJvb3N0XHRydW5rXExJQ0VOU0VfMV8wLnR4dAogICBjOlxib29zdFx0cnVua1xtb3JlCiAgIGM6XGJvb3N0XHRydW5rXHBlb3BsZQogICBjOlxib29zdFx0cnVua1xyc3QuY3NzCiAgIGM6XGJvb3N0XHRydW5rXHN0YXR1cwogICBjOlxib29zdFx0cnVua1x0b29scwogICBjOlxib29zdFx0cnVua1x3aWtpCgomZ3Q7dHV0MyBlOlwKYm9vc3Q6OmZpbGVzeXN0ZW06OnN0YXR1czogVGhlIGRldmljZSBpcyBub3QgcmVhZHk6ICZxdW90O2U6XCZxdW90OzwvcHJlPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHA+Tm90IGJhZCwgYnV0IHdlIGNhbiBtYWtlIGZ1cnRoZXIgaW1wcm92ZW1lbnRzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5UaGUgbGlzdGluZyB3b3VsZCBiZSBtdWNoIGVhc2llciB0byByZWFkIGlmIG9ubHkgdGhlIGZpbGVuYW1lIHdhcyAKICAgICAgZGlzcGxheWVkLCByYXRoZXIgdGhhbiB0aGUgZnVsbCBwYXRoLjxicj4KJm5ic3A7PC9saT4KICAgICAgPGxpPlRoZSBMaW51eCBsaXN0aW5nIGlzbid0IHNvcnRlZC4gVGhhdCdzIGJlY2F1c2UgdGhlIG9yZGVyaW5nIG9mIAogICAgICBkaXJlY3RvcnkgaXRlcmF0aW9uIGlzIHVuc3BlY2lmaWVkLiBPcmRlcmluZyBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIAogICAgICBvcGVyYXRpbmcgc3lzdGVtIEFQSSBhbmQgZmlsZSBzeXN0ZW0gc3BlY2lmaWNzLiBTbyB3ZSBuZWVkIHRvIHNvcnQgdGhlIAogICAgICByZXN1bHRzIG91cnNlbHZlcy4gPC9saT4KICAgIDwvdWw+Cgo8cD5Nb3ZlIG9uIHRvIDxjb2RlPnR1dDQuY3BwPC9jb2RlPiB0byBzZWUgaG93IHRob3NlIGNoYW5nZXMgcGxheSBvdXQhPC9wPgoKPGgyPjxhIG5hbWU9IlVzaW5nLXBhdGgtZGVjb21wb3NpdGlvbiI+VXNpbmcgcGF0aCBkZWNvbXBvc2l0aW9uLCBwbHVzIHNvcnRpbmcgcmVzdWx0czwvYT4gLSAoPGEgaHJlZj0iLi4vZXhhbXBsZS90dXQ0LmNwcCI+dHV0NC5jcHA8L2E+KTwvaDI+Cgo8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgPHRyPgogICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgPHByZT48YSBocmVmPSIuLi9leGFtcGxlL3R1dDQuY3BwIj50dXQ0LmNwcDwvYT48L3ByZT4KICAgIDxibG9ja3F1b3RlIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgICA8cHJlPmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICA8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNjbGFzcy1wYXRoIj5wYXRoPC9hPiBwIChhcmd2WzFdKTsgICAvLyBwIHJlYWRzIGNsZWFyZXIgdGhhbiBhcmd2WzFdIGluIHRoZSBmb2xsb3dpbmcgY29kZQoKICB0cnkKICB7CiAgICBpZiAoPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjZXhpc3RzLXBhdGgiPmV4aXN0czwvYT4ocCkpICAgIC8vIGRvZXMgcCBhY3R1YWxseSBleGlzdD8KICAgIHsKICAgICAgaWYgKDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2lzX3JlZ3VsYXJfZmlsZS1wYXRoIj5pc19yZWd1bGFyX2ZpbGU8L2E+KHApKSAgICAgICAgLy8gaXMgcCBhIHJlZ3VsYXIgZmlsZT8gICAKICAgICAgICBjb3V0ICZsdDsmbHQ7IHAgJmx0OyZsdDsgJnF1b3Q7IHNpemUgaXMgJnF1b3Q7ICZsdDsmbHQ7IDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI2ZpbGVfc2l6ZSI+ZmlsZV9zaXplPC9hPihwKSAmbHQ7Jmx0OyAnXG4nOwoKICAgICAgZWxzZSBpZiAoPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwjaXNfZGlyZWN0b3J5LXBhdGgiPmlzX2RpcmVjdG9yeTwvYT4ocCkpICAgICAgLy8gaXMgcCBhIGRpcmVjdG9yeT8KICAgICAgewogICAgICAgIGNvdXQgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDsgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZzpcbiZxdW90OzsKCiAgICAgICAgdHlwZWRlZiB2ZWN0b3ImbHQ7cGF0aCZndDsgdmVjOyAgICAgICAgICAgICAvLyBzdG9yZSBwYXRocywKICAgICAgICB2ZWMgdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBzb3J0IHRoZW0gbGF0ZXIKCiAgICAgICAgY29weShkaXJlY3RvcnlfaXRlcmF0b3IocCksIGRpcmVjdG9yeV9pdGVyYXRvcigpLCBiYWNrX2luc2VydGVyKHYpKTsKCiAgICAgICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOyAgICAgICAgICAgICAvLyBzb3J0LCBzaW5jZSBkaXJlY3RvcnkgaXRlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgb3JkZXJlZCBvbiBzb21lIGZpbGUgc3lzdGVtcwogIAogICAgICAgIGZvciAodmVjOjpjb25zdF9pdGVyYXRvciBpdCAodi5iZWdpbigpKTsgaXQgIT0gdi5lbmQoKTsgKytpdCkKICAgICAgICB7CiAgICAgICAgICBjb3V0ICZsdDsmbHQ7ICZxdW90OyAgICZxdW90OyAmbHQ7Jmx0OyAqaXQgJmx0OyZsdDsgJ1xuJzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UKICAgICAgICBjb3V0ICZsdDsmbHQ7IHAgJmx0OyZsdDsgJnF1b3Q7IGV4aXN0cywgYnV0IGlzIG5laXRoZXIgYSByZWd1bGFyIGZpbGUgbm9yIGEgZGlyZWN0b3J5XG4mcXVvdDs7CiAgICB9CiAgICBlbHNlCiAgICAgIGNvdXQgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDsgZG9lcyBub3QgZXhpc3RcbiZxdW90OzsKICB9CgogIGNhdGNoIChjb25zdCBmaWxlc3lzdGVtX2Vycm9yJmFtcDsgZXgpCiAgewogICAgY291dCAmbHQ7Jmx0OyBleC53aGF0KCkgJmx0OyZsdDsgJ1xuJzsKICB9CgogIHJldHVybiAwOwp9PC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CgogICAgPHA+VGhlIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gPGNvZGU+dHV0My5jcHA8L2NvZGU+IGFuZCA8Y29kZT50dXQ0LmNwcDwvY29kZT4gaXMgCiAgICB3aGF0IGhhcHBlbnMgaW4gdGhlIGRpcmVjdG9yeSBpdGVyYXRpb24gbG9vcC4gV2UgY2hhbmdlZDo8L3A+CiAgICA8YmxvY2txdW90ZT4KICAgICAgPHByZT5jb3V0ICZsdDsmbHQ7ICZxdW90OyAmcXVvdDsgJmx0OyZsdDsgKml0ICZsdDsmbHQ7ICdcbic7ICAgLy8gKml0IHJldHVybnMgYSA8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNDbGFzcy1kaXJlY3RvcnlfZW50cnkiPmRpcmVjdG9yeV9lbnRyeTwvYT4sPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8cD50bzo8L3A+CiAgICA8YmxvY2txdW90ZT4KICAgICAgPHByZT5wYXRoIGZuID0gaXQtJmd0O3BhdGgoKS5maWxlbmFtZSgpOyAgIC8vIGV4dHJhY3QgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHBhdGgKdi5wdXNoX2JhY2soZm4pOyAgICAgICAgICAgICAgICAgICAvLyBwdXNoIGludG8gdmVjdG9yIGZvciBsYXRlciBzb3J0aW5nPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8cD48Y29kZT48YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNkaXJlY3RvcnlfZW50cnktb2JzZXJ2ZXJzIj5wYXRoKCk8L2E+PC9jb2RlPiAKICAgIGlzIGEgPGNvZGU+ZGlyZWN0b3J5X2VudHJ5PC9jb2RlPiBvYnNlcnZlciBmdW5jdGlvbi4gPGNvZGU+CiAgICA8YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNwYXRoLWZpbGVuYW1lIj5maWxlbmFtZSgpPC9hPjwvY29kZT4gaXMgb25lIG9mIAogICAgc2V2ZXJhbCBwYXRoIGRlY29tcG9zaXRpb24gZnVuY3Rpb25zLiBJdCBleHRyYWN0cyB0aGUgZmlsZW5hbWUgcG9ydGlvbiAoPGNvZGU+JnF1b3Q7aW5kZXguaHRtbCZxdW90OzwvY29kZT4pIAogICAgZnJvbSBhIHBhdGggKDxjb2RlPiZxdW90Oy9ob21lL2JlbWFuL2Jvb3N0L3RydW5rL2luZGV4Lmh0bWwmcXVvdDs8L2NvZGU+KS4gVGhlc2UgZGVjb21wb3NpdGlvbiBmdW5jdGlvbnMgYXJlIAogICAgbW9yZSBmdWxseSBleHBsb3JlZCBpbiB0aGUgPGEgaHJlZj0iI0NsYXNzIHBhdGgtaXRlcmF0b3JzLWV0YyI+UGF0aCBpdGVyYXRvcnMsIG9ic2VydmVycywgCiAgICBjb21wb3NpdGlvbiwgZGVjb21wb3NpdGlvbiBhbmQgcXVlcnk8L2E+IHBvcnRpb24gb2YgdGhpcyB0dXRvcmlhbC48L3A+CiAgICA8cD5UaGUgYWJvdmUgd2FzIHdyaXR0ZW4gYXMgdHdvIGxpbmVzIG9mIGNvZGUgZm9yIGNsYXJpdHkuIEl0IGNvdWxkIGhhdmUgCiAgICBiZWVuIHdyaXR0ZW4gbW9yZSBjb25jaXNlbHkgYXM6PC9wPgogICAgPGJsb2NrcXVvdGU+CiAgICAgIDxwcmU+di5wdXNoX2JhY2soaXQtJmd0O3BhdGgoKS5maWxlbmFtZSgpKTsgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBmaWxlbmFtZTwvcHJlPgogICAgPC9ibG9ja3F1b3RlPgogICAgPHA+SGVyZSBpcyB0aGUgb3V0cHV0IGZyb20gYSB0ZXN0IG9mIDxjb2RlPjxhIGhyZWY9Ii4uL2V4YW1wbGUvdHV0NC5jcHAiPnR1dDQuY3BwPC9hPjwvY29kZT46PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICAgIDxwcmU+JCAuL3R1dDQgfi9ib29zdC90cnVuawovaG9tZS9iZW1hbi9ib29zdC90cnVuayBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nOgogIC5zdm4KICBDTWFrZUxpc3RzLnR4dAogIElOU1RBTEwKICBKYW1yb290CiAgTElDRU5TRV8xXzAudHh0CiAgYm9vc3QKICBib29zdC1idWlsZC5qYW0KICBib29zdC5jc3MKICBib29zdC5wbmcKICBib290c3RyYXAuYmF0CiAgYm9vdHN0cmFwLnNoCiAgZG9jCiAgaW5kZXguaHRtCiAgaW5kZXguaHRtbAogIGxpYnMKICBtb3JlCiAgcGVvcGxlCiAgcnN0LmNzcwogIHN0YXR1cwogIHRvb2xzCiAgd2lraTwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICAgIDxwcmU+QzpcdjNkJmd0O3R1dDQgYzpcYm9vc3RcdHJ1bmsKYzpcYm9vc3RcdHJ1bmsgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZzoKICAuc3ZuCiAgQ01ha2VMaXN0cy50eHQKICBJTlNUQUxMCiAgSmFtcm9vdAogIExJQ0VOU0VfMV8wLnR4dAogIGJvb3N0CiAgYm9vc3QtYnVpbGQuamFtCiAgYm9vc3QuY3NzCiAgYm9vc3QucG5nCiAgYm9vdHN0cmFwLmJhdAogIGJvb3RzdHJhcC5zaAogIGRvYwogIGluZGV4Lmh0bQogIGluZGV4Lmh0bWwKICBsaWJzCiAgbW9yZQogIHBlb3BsZQogIHJzdC5jc3MKICBzdGF0dXMKICB0b29scwogIHdpa2k8L3ByZT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KCiAgICA8cD5UaGF0IGNvbXBsZXRlcyB0aGUgbWFpbiBwb3J0aW9uIG9mIHRoaXMgdHV0b3JpYWwuIElmIHlvdSBoYXZlbid0IGFscmVhZHkgCiAgICB3b3JrZWQgdGhyb3VnaCB0aGUgPGEgaHJlZj0iI0NsYXNzLXBhdGgtQ29uc3RydWN0b3JzIj5DbGFzcyBwYXRoPC9hPiBzZWN0aW9ucyBvZiB0aGlzIHR1dG9yaWFsLCBkaWcgaW50byB0aGVtIG5vdy4gCiAgICBUaGUgPGEgaHJlZj0iI0Vycm9yLXJlcG9ydGluZyI+RXJyb3IgcmVwb3J0aW5nPC9hPiBzZWN0aW9uIG1heSBhbHNvIGJlIG9mIAogICAgaW50ZXJlc3QsIGFsdGhvdWdoIGl0IGNhbiBiZSBza2lwcGVkIHVubGVzcyB5b3UgYXJlIGRlZXBseSBjb25jZXJuZWQgYWJvdXQgCiAgICBlcnJvciBoYW5kbGluZyBpc3N1ZXMuPC9wPgoKPGhyPgoKPGgyPiZuYnNwOzxhIG5hbWU9IkNsYXNzLXBhdGgtQ29uc3RydWN0b3JzIj5DbGFzcyBwYXRoOiBDb25zdHJ1Y3RvcnM8L2E+LCAKaW5jbHVkaW5nIFVuaWNvZGUgLSAoPGEgaHJlZj0iLi4vZXhhbXBsZS90dXQ1LmNwcCI+dHV0NS5jcHA8L2E+KTwvaDI+Cgo8cD5UcmFkaXRpb25hbCBDIGludGVyZmFjZXMgcGFzcyBwYXRocyBhcyA8Y29kZT5jb25zdCBjaGFyKjwvY29kZT4gYXJndW1lbnRzLiAKQysrIGludGVyZmFjZXMgbWF5IGFkZCA8Y29kZT5jb25zdCBzdGQ6OnN0cmluZyZhbXA7PC9jb2RlPiBvdmVybG9hZHMsIGJ1dCBhZGRpbmcgCm92ZXJsb2FkcyBiZWNvbWVzIHVudGVuYWJsZSBpZiB3aWRlIGNoYXJhY3RlcnMsIGNvbnRhaW5lcnMsIGFuZCBpdGVyYXRvciByYW5nZXMgCm5lZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KPHA+UGFzc2luZyBwYXRocyBhcyA8Y29kZT5jb25zdCBwYXRoJmFtcDs8L2NvZGU+IGFyZ3VtZW50cyBpcyBmYXIgc2ltcGxlciwgeWV0IGZhciAKbW9yZSBmbGV4aWJsZSBiZWNhdXNlIGNsYXNzIDxjb2RlPnBhdGg8L2NvZGU+IGl0c2VsZiBpcyBmYXIgbW9yZSBmbGV4aWJsZTo8L3A+CjxvbD4KICA8bGk+Q2xhc3MgPGNvZGU+cGF0aDwvY29kZT4gc3VwcG9ydHMgbXVsdGlwbGUgY2hhcmFjdGVyIHR5cGVzIGFuZCBlbmNvZGluZ3MsIGluY2x1ZGluZyBVbmljb2RlLCB0byAKICBlYXNlIGludGVybmF0aW9uYWxpemF0aW9uLjwvbGk+CiAgPGxpPkNsYXNzIDxjb2RlPnBhdGg8L2NvZGU+IHN1cHBvcnRzIG11bHRpcGxlIHNvdXJjZSB0eXBlcywgc3VjaCBhcyBpdGVyYXRvcnMgZm9yIG51bGwgdGVybWluYXRlZCAKICBzZXF1ZW5jZXMsIGl0ZXJhdG9yIHJhbmdlcywgY29udGFpbmVycyAoaW5jbHVkaW5nIDxjb2RlPnN0ZDo6YmFzaWNfc3RyaW5nPC9jb2RlPiksIAogIGFuZCA8Y29kZT48YSBocmVmPSJyZWZlcmVuY2UuaHRtbCNDbGFzcy1kaXJlY3RvcnlfZW50cnkiPmRpcmVjdG9yeV9lbnRyeTwvYT48L2NvZGU+J3MsIAogIHNvIGZ1bmN0aW9ucyB0YWtpbmcgcGF0aHMgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHNldmVyYWwgb3ZlcmxvYWRzLjwvbGk+CiAgPGxpPkNsYXNzIDxjb2RlPnBhdGg8L2NvZGU+IHN1cHBvcnRzIGJvdGggbmF0aXZlIGFuZCBnZW5lcmljIHBhdGhuYW1lIGZvcm1hdHMsIHNvIHByb2dyYW1zIGNhbiBiZSAKICBwb3J0YWJsZSBiZXR3ZWVuIG9wZXJhdGluZyBzeXN0ZW1zIHlldCB1c2UgbmF0aXZlIGZvcm1hdHMgd2hlcmUgZGVzaXJhYmxlLjwvbGk+CiAgPGxpPkNsYXNzIDxjb2RlPnBhdGg8L2NvZGU+IHN1cHBsaWVzIGEgZnVsbCBzZXQgb2YgaXRlcmF0b3JzLCBvYnNlcnZlcnMsIGNvbXBvc2l0aW9uLCAKICBkZWNvbXBvc2l0aW9uLCBhbmQgcXVlcnkgZnVuY3Rpb25zLCBtYWtpbmcgcGF0aG5hbWUgbWFuaXB1bGF0aW9ucyBlYXN5LCAKICBjb252ZW5pZW50LCByZWxpYWJsZSwgYW5kIHBvcnRhYmxlLjwvbGk+Cjwvb2w+CjxwPkhlcmUgaXMgaG93ICgxKSBhbmQgKDIpIHdvcmsuIENsYXNzIHBhdGggY29uc3RydWN0b3JzLCAKYXNzaWdubWVudHMsIGFuZCBhcHBlbmRzIGhhdmUgbWVtYmVyIHRlbXBsYXRlcyBmb3Igc291cmNlcy4gRm9yIGV4YW1wbGUsIGhlcmUgCmFyZSB0aGUgY29uc3RydWN0b3JzIHRoYXQgdGFrZSBzb3VyY2VzOjwvcD4KCjxibG9ja3F1b3RlIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogIDxwcmU+dGVtcGxhdGUgJmx0O2NsYXNzIDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI1NvdXJjZSI+U291cmNlPC9hPiZndDsKICBwYXRoKFNvdXJjZSBjb25zdCZhbXA7IHNvdXJjZSk7PC9wcmU+CiAgPHByZT50ZW1wbGF0ZSAmbHQ7Y2xhc3MgSW5wdXRJdGVyYXRvciZndDsKICBwYXRoKElucHV0SXRlcmF0b3IgYmVnaW4sIElucHV0SXRlcmF0b3IgZW5kKTs8L3ByZT4KPC9ibG9ja3F1b3RlPgo8cD5MZXQncyBsb29rIGF0IGEgbGl0dGxlIHByb2dyYW0gdGhhdCBzaG93cyBob3cgY29tZm9ydGFibGUgY2xhc3MgPGNvZGU+cGF0aDwvY29kZT4gaXMgd2l0aCAKYm90aCBuYXJyb3cgYW5kIHdpZGUgY2hhcmFjdGVycyBpbiBDLXN0eWxlIHN0cmluZ3MsIEMrKyBzdHJpbmdzLCBhbmQgdmlhIEMrKyAKaXRlcmF0b3JzOjwvcD4KCjx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICA8dHI+CiAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICA8cHJlPjxhIGhyZWY9Ii4uL2V4YW1wbGUvdHV0NC5jcHAiPnR1dDUuY3BwPC9hPjwvcHJlPgogICAgPGJsb2NrcXVvdGU+CiAgICAgIDxwcmU+I2luY2x1ZGUgJmx0O2Jvb3N0L2ZpbGVzeXN0ZW0uaHBwJmd0OwojaW5jbHVkZSAmbHQ7c3RyaW5nJmd0OwojaW5jbHVkZSAmbHQ7bGlzdCZndDsKbmFtZXNwYWNlIGZzID0gYm9vc3Q6OmZpbGVzeXN0ZW07CgppbnQgbWFpbigpCnsKICAvLyBcdTI2M0EgaXMgJnF1b3Q7VW5pY29kZSBXSElURSBTTUlMSU5HIEZBQ0UgPSBoYXZlIGEgbmljZSBkYXkhJnF1b3Q7CiAgc3RkOjpzdHJpbmcgbmFycm93X3N0cmluZyAoJnF1b3Q7c21pbGUyJnF1b3Q7KTsKICBzdGQ6OndzdHJpbmcgd2lkZV9zdHJpbmcgKEwmcXVvdDtzbWlsZTJcdTI2M0EmcXVvdDspOwogIHN0ZDo6bGlzdCZsdDtjaGFyJmd0OyBuYXJyb3dfbGlzdDsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJ3MnKTsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJ20nKTsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJ2knKTsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJ2wnKTsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJ2UnKTsKICBuYXJyb3dfbGlzdC5wdXNoX2JhY2soJzMnKTsKICBzdGQ6Omxpc3QmbHQ7d2NoYXJfdCZndDsgd2lkZV9saXN0OwogIHdpZGVfbGlzdC5wdXNoX2JhY2soTCdzJyk7CiAgd2lkZV9saXN0LnB1c2hfYmFjayhMJ20nKTsKICB3aWRlX2xpc3QucHVzaF9iYWNrKEwnaScpOwogIHdpZGVfbGlzdC5wdXNoX2JhY2soTCdsJyk7CiAgd2lkZV9saXN0LnB1c2hfYmFjayhMJ2UnKTsKICB3aWRlX2xpc3QucHVzaF9iYWNrKEwnMycpOwogIHdpZGVfbGlzdC5wdXNoX2JhY2soTCdcdTI2M0EnKTsKCiAgeyBmczo6b2ZzdHJlYW0gZigmcXVvdDtzbWlsZSZxdW90Oyk7IH0KICB7IGZzOjpvZnN0cmVhbSBmKEwmcXVvdDtzbWlsZVx1MjYzQSZxdW90Oyk7IH0KICB7IGZzOjpvZnN0cmVhbSBmKG5hcnJvd19zdHJpbmcpOyB9CiAgeyBmczo6b2ZzdHJlYW0gZih3aWRlX3N0cmluZyk7IH0KICB7IGZzOjpvZnN0cmVhbSBmKG5hcnJvd19saXN0KTsgfQogIHsgZnM6Om9mc3RyZWFtIGYod2lkZV9saXN0KTsgfQogIG5hcnJvd19saXN0LnBvcF9iYWNrKCk7CiAgbmFycm93X2xpc3QucHVzaF9iYWNrKCc0Jyk7CiAgd2lkZV9saXN0LnBvcF9iYWNrKCk7CiAgd2lkZV9saXN0LnBvcF9iYWNrKCk7CiAgd2lkZV9saXN0LnB1c2hfYmFjayhMJzQnKTsKICB3aWRlX2xpc3QucHVzaF9iYWNrKEwnXHUyNjNBJyk7CiAgeyBmczo6b2ZzdHJlYW0gZihmczo6cGF0aChuYXJyb3dfbGlzdC5iZWdpbigpLCBuYXJyb3dfbGlzdC5lbmQoKSkpOyB9CiAgeyBmczo6b2ZzdHJlYW0gZihmczo6cGF0aCh3aWRlX2xpc3QuYmVnaW4oKSwgd2lkZV9saXN0LmVuZCgpKSk7IH0KCiAgcmV0dXJuIDA7Cn08L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjxwPlRlc3RpbmcgPGNvZGU+dHV0NTwvY29kZT46PC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5VYnVudHUgTGludXggPC9iPjwvaT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+TWljcm9zb2Z0IFdpbmRvd3M8L2I+PC9pPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiQgLi90dXQ1CiQgbHMgc21pbGUqCnNtaWxlIHNtaWxlJiM5Nzg2OyBzbWlsZTIgc21pbGUyJiM5Nzg2OyBzbWlsZTMgc21pbGUzJiM5Nzg2OyBzbWlsZTQgc21pbGU0JiM5Nzg2OzwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCIgdmFsaWduPSJ0b3AiPgogICAgICA8cHJlPiZndDt0dXQ1CiZndDtkaXIgL2Igc21pbGUqCnNtaWxlCnNtaWxlMgpzbWlsZTImIzk3ODY7CnNtaWxlMwpzbWlsZTMmIzk3ODY7CnNtaWxlNApzbWlsZTQmIzk3ODY7CnNtaWxlJiM5Nzg2OzwvcHJlPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHA+Tm90ZSB0aGF0IHRoZSBleGFjdCBhcHBlYXJhbmNlIG9mIHRoZSBzbWlsaW5nIGZhY2Ugd2lsbCBkZXBlbmQgb24gdGhlIGZvbnQsIApmb250IHNpemUsIGFuZCBvdGhlciBzZXR0aW5ncyBmb3IgeW91ciBjb21tYW5kIGxpbmUgd2luZG93LiBUaGUgYWJvdmUgdGVzdHMgd2VyZSAKcnVuIHdpdGggb3V0LW9mLXRoZS1ib3ggVWJ1bnR1IDkuMTAgYW5kIFdpbmRvd3MgNywgVVMgRWRpdGlvbi4gSWYgeW91IGRvbid0IGdldCAKdGhlIGFib3ZlIHJlc3VsdHMsIHRha2UgYSBsb29rIGF0IHRoZSA8Y29kZT48aT5ib29zdC1yb290PC9pPi9saWJzL2ZpbGVzeXN0ZW0vZXhhbXBsZS90ZXN0PC9jb2RlPiAKZGlyZWN0b3J5IHdpdGggeW91ciBzeXN0ZW0ncyBHVUkgZmlsZSBicm93c2VyLCBzdWNoIGFzIExpbnV4IE5hdXRpbHVzLCBNYWMgT1MgWCAKRmluZGVyLCBvciBXaW5kb3dzIEV4cGxvcmVyLiBUaGVzZSB0ZW5kIHRvIGJlIG1vcmUgY29tZm9ydGFibGUgd2l0aCAKaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0cyB0aGFuIGNvbW1hbmQgbGluZSBpbnRlcnByZXRlcnMuPC9wPgoKICA8cD5DbGFzcyA8Y29kZT5wYXRoPC9jb2RlPiB0YWtlcyBjYXJlIG9mIHdoYXRldmVyIGNoYXJhY3RlciB0eXBlIG9yIGVuY29kaW5nIAogIGNvbnZlcnNpb25zIGFyZSByZXF1aXJlZCBieSB0aGUgcGFydGljdWxhciBvcGVyYXRpbmcgc3lzdGVtLiBUaHVzIGFzIDxjb2RlPgogIHR1dDU8L2NvZGU+IGRlbW9uc3RyYXRlcywgaXQncyBubyBwcm9ibGVtIHRvIHBhc3MgYSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgdG8gYSAKICBCb29zdC5GaWxlc3lzdGVtIG9wZXJhdGlvbmFsIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSAKICB1c2VzIG5hcnJvdyBjaGFyYWN0ZXJzLCBhbmQgdmlzYSB2ZXJzYS4gQW5kIHRoZSBzYW1lIGFwcGxpZXMgdG8gdXNlciBzdXBwbGllZCAKICBmdW5jdGlvbnMgdGhhdCB0YWtlIDxjb2RlPmNvbnN0IHBhdGgmYW1wOzwvY29kZT4gYXJndW1lbnRzLjwvcD4KCiAgPHA+Q2xhc3MgPGNvZGU+cGF0aDwvY29kZT4gYWxzbyBwcm92aWRlcyBwYXRoIHN5bnRheCB0aGF0IGlzIHBvcnRhYmxlIGFjcm9zcyBvcGVyYXRpbmcgc3lzdGVtcywgCiAgZWxlbWVudCBpdGVyYXRvcnMsIGFuZCBvYnNlcnZlciwgY29tcG9zaXRpb24sIGRlY29tcG9zaXRpb24sIGFuZCBxdWVyeSAKICBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgZWxlbWVudHMgb2YgYSBwYXRoLiBUaGUgbmV4dCBzZWN0aW9uIG9mIHRoaXMgCiAgdHV0b3JpYWwgZGVhbHMgd2l0aCBwYXRoIHN5bnRheC48L3A+CgogICAgPGhyPgoKPGgyPjxhIG5hbWU9IkNsYXNzLXBhdGgtZm9ybWF0cyI+Q2xhc3MgcGF0aDogR2VuZXJpYyBmb3JtYXQgdnMuIE5hdGl2ZSBmb3JtYXQ8L2E+PC9oMj4KCjxwIGRpcj0ibHRyIj5DbGFzcyA8Y29kZT5wYXRoPC9jb2RlPiBkZWFscyB3aXRoIHR3byBkaWZmZXJlbnQgcGF0aG5hbWUgCmZvcm1hdHMgLSBnZW5lcmljIGZvcm1hdCBhbmQgbmF0aXZlIGZvcm1hdC4gRm9yIFBPU0lYLWxpa2UgCmZpbGUgc3lzdGVtcywgdGhlc2UgZm9ybWF0cyBhcmUgdGhlIHNhbWUuIEJ1dCBmb3IgdXNlcnMgb2YgV2luZG93cyBhbmQgCm90aGVyIG5vbi1QT1NJWCBmaWxlIHN5c3RlbXMsIHRoZSBkaXN0aW5jdGlvbiBpcyBpbXBvcnRhbnQuIEV2ZW4gCnByb2dyYW1tZXJzIHdyaXRpbmcgZm9yIFBPU0lYLWxpa2Ugc3lzdGVtcyBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRpc3RpbmN0aW9uIGlmIAp0aGV5IHdhbnQgdGhlaXIgY29kZSB0byBiZSBwb3J0YWJsZSB0byBub24tUE9TSVggc3lzdGVtcy48L3A+Cgo8cCBkaXI9Imx0ciI+VGhlIDxiPmdlbmVyaWMgZm9ybWF0PC9iPiBpcyB0aGUgZmFtaWxpYXIgPGNvZGU+L215X2RpcmVjdG9yeS9teV9maWxlLnR4dDwvY29kZT4gZm9ybWF0IHVzZWQgYnkgUE9TSVgtbGlrZSAKb3BlcmF0aW5nIHN5c3RlbXMgc3VjaCBhcyB0aGUgVW5peCB2YXJpYW50cywgTGludXgsIGFuZCBNYWMgT1MgWC4gV2luZG93cyBhbHNvIApyZWNvZ25pemVzIHRoZSBnZW5lcmljIGZvcm1hdCwgYW5kIGl0IGlzIHRoZSBiYXNpcyBmb3IgdGhlIGZhbWlsaWFyIEludGVybmV0IFVSTCAKZm9ybWF0LiBUaGUgZGlyZWN0b3J5IApzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGFsd2F5cyBvbmUgb3IgbW9yZSBzbGFzaCBjaGFyYWN0ZXJzLjwvcD4KCjxwIGRpcj0ibHRyIj5UaGUgPGI+bmF0aXZlIGZvcm1hdDwvYj4gaXMgdGhlIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IHRoZSBwYXJ0aWN1bGFyIApvcGVyYXRpbmcgc3lzdGVtLiBGb3IgV2luZG93cywgZWl0aGVyIHRoZSBzbGFzaCBvciB0aGUgYmFja3NsYXNoIGNhbiBiZSB1c2VkIGFzIAp0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIsIHNvIDxjb2RlPi9teV9kaXJlY3RvcnlcbXlfZmlsZS50eHQ8L2NvZGU+IAp3b3VsZCB3b3JrIGZpbmUuIE9mIGNvdXJzZSwgaWYgeW91IHdyaXRlIHRoYXQgaW4gYSBDKysgc3RyaW5nIGxpdGVyYWwsIGl0IApiZWNvbWVzIDxjb2RlPiZxdW90Oy9teV9kaXJlY3RvcnlcXG15X2ZpbGUudHh0JnF1b3Q7PC9jb2RlPi48L3A+Cgo8cCBkaXI9Imx0ciI+SWYgYSBkcml2ZSBzcGVjaWZpZXIgb3IgYSBiYWNrc2xhc2ggYXBwZWFycyAKaW4gYSBwYXRobmFtZSBvbiBhIFdpbmRvd3Mgc3lzdGVtLCBpdCBpcyBhbHdheXMgdHJlYXRlZCBhcyB0aGUgbmF0aXZlIGZvcm1hdC48L3A+Cgo8cCBkaXI9Imx0ciI+Q2xhc3MgPGNvZGU+cGF0aDwvY29kZT4gaGFzIG9ic2VydmVyIGZ1bmN0aW9ucyB0aGF0IGFsbG93IHlvdSB0byAKb2J0YWluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwYXRoIG9iamVjdCBpbiBlaXRoZXIgdGhlIG5hdGl2ZSBmb3JtYXQgCm9yIHRoZSBnZW5lcmljIGZvcm1hdC4gU2VlIHRoZSA8YSBocmVmPSIjQ2xhc3MgcGF0aC1pdGVyYXRvcnMtZXRjIj5uZXh0IHNlY3Rpb248L2E+IApmb3IgaG93IHRoYXQgcGxheXMgb3V0LjwvcD4KCiAgPHA+VGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gZ2VuZXJpYyBmb3JtYXQgYW5kIG5hdGl2ZSBmb3JtYXQgaXMgaW1wb3J0YW50IHdoZW4gCiAgY29tbXVuaWNhdGluZyB3aXRoIG5hdGl2ZSBDLXN0eWxlIEFQSSdzIGFuZCB3aXRoIHVzZXJzLiBCb3RoIHRlbmQgdG8gZXhwZWN0IAogIHBhdGhzIGluIHRoZSBuYXRpdmUgZm9ybWF0IGFuZCBtYXkgYmUgY29uZnVzZWQgYnkgdGhlIGdlbmVyaWMgZm9ybWF0LiBUaGUgZ2VuZXJpYyAKICBmb3JtYXQgaXMgZ3JlYXQsIGhvd2V2ZXIsIGZvciB3cml0aW5nIHBvcnRhYmxlIHByb2dyYW1zIHRoYXQgd29yayByZWdhcmRsZXNzIAogIG9mIG9wZXJhdGluZyBzeXN0ZW0uPC9wPgoKICA8cD5UaGUgbmV4dCBzZWN0aW9uIGNvdmVycyBjbGFzcyA8Y29kZT5wYXRoPC9jb2RlPiBvYnNlcnZlcnMsIGNvbXBvc2l0aW9uLCAKICBkZWNvbXBvc2l0aW9uLCBxdWVyeSwgYW5kIGl0ZXJhdGlvbiBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHBhdGguPC9wPgoKICAgIDxocj4KCjxoMj48YSBuYW1lPSJDbGFzcyBwYXRoLWl0ZXJhdG9ycy1ldGMiPkNsYXNzIHBhdGg6IEl0ZXJhdG9ycywgb2JzZXJ2ZXJzLCBjb21wb3NpdGlvbiwgZGVjb21wb3NpdGlvbiwgYW5kIHF1ZXJ5PC9hPiAKLSAoPGEgaHJlZj0iLi4vZXhhbXBsZS9wYXRoX2luZm8uY3BwIj5wYXRoX2luZm8uY3BwPC9hPik8L2gyPgoKPHA+VGhlIDxjb2RlPjxhIGhyZWY9Ii4uL2V4YW1wbGUvcGF0aF9pbmZvLmNwcCI+cGF0aF9pbmZvLmNwcDwvYT48L2NvZGU+IHByb2dyYW0gaXMgaGFuZHkgZm9yIGxlYXJuaW5nIGhvdyBjbGFzcyA8Y29kZT5wYXRoPC9jb2RlPiAKaXRlcmF0b3JzLCAKb2JzZXJ2ZXJzLCBjb21wb3NpdGlvbiwgZGVjb21wb3NpdGlvbiwgYW5kIHF1ZXJ5IGZ1bmN0aW9ucyB3b3JrIG9uIHlvdXIgc3lzdGVtLiAKSWYgaXQgaGFzbid0IGFscmVhZHkgYWxyZWFkeSBiZWVuIGJ1aWx0IG9uIHlvdXIgc3lzdGVtLCBwbGVhc2UgYnVpbGQgaXQgbm93LiBSdW4gCnRoZSBleGFtcGxlcyBiZWxvdyBvbiB5b3VyIHN5c3RlbSwgYW5kIHRyeSBzb21lIGRpZmZlcmVudCBwYXRoIGFyZ3VtZW50cyBhcyB3ZSAKZ28gYWxvbmcuPC9wPgoKPHA+IDxjb2RlPnBhdGhfaW5mbzwvY29kZT4gcHJvZHVjZXMgc2V2ZXJhbCBkb3plbiBvdXRwdXQgbGluZXMgZXZlcnkgdGltZSBpdCdzIAppbnZva2VkLiBXZSB3aWxsIG9ubHkgc2hvdyB0aGUgb3V0cHV0IGxpbmVzIHdlIGFyZSBpbnRlcmVzdGVkIGluIGF0IGVhY2ggc3RlcC48L3A+Cgo8cD5GaXJzdCB3ZSdsbCBsb29rIGF0IGl0ZXJhdGlvbiBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHBhdGgsIGFuZCB0aGVuIHVzZSAKaXRlcmF0aW9uIHRvIGlsbHVzdHJhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBnZW5lcmljIGFuZCBuYXRpdmUgZm9ybWF0IHBhdGhzLjwvcD4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSI5MCUiPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+VWJ1bnR1IExpbnV4IDwvYj48L2k+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPk1pY3Jvc29mdCBXaW5kb3dzPC9iPjwvaT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgICA8cHJlPiQgLi9wYXRoX2luZm8gL2Zvby9iYXIvYmFhLnR4dAouLi4KZWxlbWVudHM6CiAgLwogIGZvbwogIGJhcgogIGJhYS50eHQ8L3ByZT4KICAgICAgPC90ZD4KICAgICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgICA8cHJlPiZndDtwYXRoX2luZm8gL2Zvby9iYXIvYmFhLnR4dAouLi4KZWxlbWVudHM6CiAgLwogIGZvbwogIGJhcgogIGJhYS50eHQ8L3ByZT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KCjxwPlRodXMgb24gYm90aCBQT1NJWCBhbmQgV2luZG93cyBiYXNlZCBzeXN0ZW1zIHRoZSBwYXRoIDxjb2RlPiZxdW90Oy9mb28vYmFyL2JhYS50eHQmcXVvdDs8L2NvZGU+IAppcyBzZWVuIGFzIGhhdmluZyBmb3VyIGVsZW1lbnRzLjwvcD4KCjxwPkhlcmUgaXMgdGhlIGNvZGUgdGhhdCBwcm9kdWNlZCB0aGUgYWJvdmUgbGlzdGluZzo8L3A+Cgo8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzExMTExMSIgYmdjb2xvcj0iI0Q3RUVGRiIgd2lkdGg9IjkwJSI+CiAgPHRyPgogICAgPHRkIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgPGJsb2NrcXVvdGUgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICA8cHJlPmNvdXQgJmx0OyZsdDsgJnF1b3Q7XG5lbGVtZW50czpcbiZxdW90OzsKCmZvciAocGF0aDo6aXRlcmF0b3IgaXQgPSBwLmJlZ2luKCk7IGl0ICE9IHAuZW5kKCk7ICsraXQpCiAgY291dCAmbHQ7Jmx0OyAmcXVvdDsgJnF1b3Q7ICZsdDsmbHQ7ICppdCAmbHQ7Jmx0OyAnXG4nOzwvcHJlPgogICAgPC9ibG9ja3F1b3RlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8cD48Y29kZT5wYXRoOjppdGVyYXRvcjo6dmFsdWVfdHlwZTwvY29kZT4gaXMgPGNvZGU+cGF0aDo6c3RyaW5nX3R5cGU8L2NvZGU+LCAKYW5kIGl0ZXJhdGlvbiB0cmVhdHMgPGNvZGU+cGF0aDwvY29kZT4gYXMgYSBjb250YWluZXIgb2YgZmlsZW5hbWVzLjwvcD4KCjxwIGRpcj0ibHRyIj5MZXQncyBsb29rIGF0IHNvbWUgb2YgdGhlIG91dHB1dCBmcm9tIGEgc2xpZ2h0bHkgZGlmZmVyZW50IApleGFtcGxlOjwvcD4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSI5MCUiPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+VWJ1bnR1IExpbnV4IDwvYj48L2k+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPk1pY3Jvc29mdCBXaW5kb3dzPC9iPjwvaT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgICA8cHJlPiQgLi9wYXRoX2luZm8gL2Zvby9iYXIvYmFhLnR4dAoKY29tcG9zZWQgcGF0aDoKICBjb3V0ICZsdDsmbHQ7IC0tLS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKICBwcmVmZXJyZWQoKS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKLi4uCm9ic2VydmVycywgbmF0aXZlIGZvcm1hdDoKICBuYXRpdmUoKS0tLS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKICBjX3N0cigpLS0tLS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKICBzdHJpbmcoKS0tLS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKICB3c3RyaW5nKCktLS0tLS0tLS0tLS06IC9mb28vYmFyL2JhYS50eHQKCm9ic2VydmVycywgZ2VuZXJpYyBmb3JtYXQ6CiAgZ2VuZXJpY19zdHJpbmcoKS0tLS0tOiAvZm9vL2Jhci9iYWEudHh0CiAgZ2VuZXJpY193c3RyaW5nKCktLS0tOiAvZm9vL2Jhci9iYWEudHh0PC9wcmU+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT4mZ3Q7cGF0aF9pbmZvIC9mb28vYmFyXGJhYS50eHQKCmNvbXBvc2VkIHBhdGg6CiAgY291dCAmbHQ7Jmx0OyAtLS0tLS0tLS0tLS0tOiAvZm9vL2Jhci9iYWEudHh0CiAgcHJlZmVycmVkKCktLS0tLS0tLS0tOiBcZm9vXGJhclxiYWEudHh0Ci4uLgpvYnNlcnZlcnMsIG5hdGl2ZSBmb3JtYXQ6CiAgbmF0aXZlKCktLS0tLS0tLS0tLS0tOiAvZm9vL2JhclxiYWEudHh0CiAgY19zdHIoKS0tLS0tLS0tLS0tLS0tOiAvZm9vL2JhclxiYWEudHh0CiAgc3RyaW5nKCktLS0tLS0tLS0tLS0tOiAvZm9vL2JhclxiYWEudHh0CiAgd3N0cmluZygpLS0tLS0tLS0tLS0tOiAvZm9vL2JhclxiYWEudHh0CgpvYnNlcnZlcnMsIGdlbmVyaWMgZm9ybWF0OgogIGdlbmVyaWNfc3RyaW5nKCktLS0tLTogL2Zvby9iYXIvYmFhLnR4dAogIGdlbmVyaWNfd3N0cmluZygpLS0tLTogL2Zvby9iYXIvYmFhLnR4dDwvcHJlPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHAgZGlyPSJsdHIiPk5hdGl2ZSBmb3JtYXQgb2JzZXJ2ZXJzIHNob3VsZCBiZSB1c2VkIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgCm9wZXJhdGluZyBzeXN0ZW0gb3Igd2l0aCB1c2VyczsgdGhhdCdzIHdoYXQgdGhleSBleHBlY3QuPC9wPgoKPHAgZGlyPSJsdHIiPkdlbmVyaWMgZm9ybWF0IG9ic2VydmVycyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSByZXN1bHRzIG5lZWQgdG8gYmUgCnBvcnRhYmxlIGFuZCB1bmlmb3JtIHJlZ2FyZGxlc3Mgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uPC9wPgoKPHAgZGlyPSJsdHIiPjxjb2RlPnBhdGg8L2NvZGU+IG9iamVjdHMgYWx3YXlzIGhvbGQgcGF0aG5hbWVzIGluIHRoZSBuYXRpdmUgCmZvcm1hdCwgYnV0IG90aGVyd2lzZSBsZWF2ZSB0aGVtIHVuY2hhbmdlZCBmcm9tIHRoZWlyIHNvdXJjZS4gVGhlCjxhIGhyZWY9InJlZmVyZW5jZS5odG1sI3ByZWZlcnJlZCI+cHJlZmVycmVkKCk8L2E+IGZ1bmN0aW9uIHdpbGwgY29udmVydCB0byB0aGUgCnByZWZlcnJlZCBmb3JtLCBpZiB0aGUgbmF0aXZlIGZvcm1hdCBoYXMgc2V2ZXJhbCBmb3Jtcy4gVGh1cyBvbiBXaW5kb3dzLCBpdCB3aWxsIApjb252ZXJ0IHNsYXNoZXMgdG8gYmFja3NsYXNoZXMuPC9wPgoKPHAgZGlyPSJsdHIiPkxldCdzIG1vdmUgb24gdG8gZGVjb21wb3NpdGlvbiBhbmQgcXVlcnkgZnVuY3Rpb25zOjwvcD4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMxMTExMTEiIGJnY29sb3I9IiNEN0VFRkYiIHdpZHRoPSI5MCUiPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjUwJSIgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+PGk+PGI+VWJ1bnR1IExpbnV4IDwvYj48L2k+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPk1pY3Jvc29mdCBXaW5kb3dzPC9iPjwvaT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPgogICAgICA8cHJlPiQgLi9wYXRoX2luZm8gL2Zvby9iYXIvYmFhLnR4dAouLi4KZGVjb21wb3NpdGlvbjoKICByb290X25hbWUoKS0tLS0tLS0tLS06CiAgcm9vdF9kaXJlY3RvcnkoKS0tLS0tOiAvCiAgcm9vdF9wYXRoKCktLS0tLS0tLS0tOiAvCiAgcmVsYXRpdmVfcGF0aCgpLS0tLS0tOiBmb28vYmFyL2JhYS50eHQKICBwYXJlbnRfcGF0aCgpLS0tLS0tLS06IC9mb28vYmFyCiAgZmlsZW5hbWUoKS0tLS0tLS0tLS0tOiBiYWEudHh0CiAgc3RlbSgpLS0tLS0tLS0tLS0tLS0tOiBiYWEKICBleHRlbnNpb24oKS0tLS0tLS0tLS06IC50eHQKCnF1ZXJ5OgogIGVtcHR5KCktLS0tLS0tLS0tLS0tLTogZmFsc2UKICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+aXNfYWJzb2x1dGU8L3NwYW4+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPigpLS0tLS0tLS06IHRydWU8L3NwYW4+CiAgaGFzX3Jvb3RfbmFtZSgpLS0tLS0tOiBmYWxzZQogIGhhc19yb290X2RpcmVjdG9yeSgpLTogdHJ1ZQogIGhhc19yb290X3BhdGgoKS0tLS0tLTogdHJ1ZQogIGhhc19yZWxhdGl2ZV9wYXRoKCktLTogdHJ1ZQogIGhhc19wYXJlbnRfcGF0aCgpLS0tLTogdHJ1ZQogIGhhc19maWxlbmFtZSgpLS0tLS0tLTogdHJ1ZQogIGhhc19zdGVtKCktLS0tLS0tLS0tLTogdHJ1ZQogIGhhc19leHRlbnNpb24oKS0tLS0tLTogdHJ1ZTwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICAgIDxwcmU+Jmd0O3BhdGhfaW5mbyAvZm9vL2Jhci9iYWEudHh0Ci4uLgpkZWNvbXBvc2l0aW9uOgogIHJvb3RfbmFtZSgpLS0tLS0tLS0tLToKICByb290X2RpcmVjdG9yeSgpLS0tLS06IC8KICByb290X3BhdGgoKS0tLS0tLS0tLS06IC8KICByZWxhdGl2ZV9wYXRoKCktLS0tLS06IGZvby9iYXIvYmFhLnR4dAogIHBhcmVudF9wYXRoKCktLS0tLS0tLTogL2Zvby9iYXIKICBmaWxlbmFtZSgpLS0tLS0tLS0tLS06IGJhYS50eHQKICBzdGVtKCktLS0tLS0tLS0tLS0tLS06IGJhYQogIGV4dGVuc2lvbigpLS0tLS0tLS0tLTogLnR4dAoKcXVlcnk6CiAgZW1wdHkoKS0tLS0tLS0tLS0tLS0tOiBmYWxzZQogIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj5pc19hYnNvbHV0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+KCktLS0tLS0tLTogZmFsc2U8L3NwYW4+CiAgaGFzX3Jvb3RfbmFtZSgpLS0tLS0tOiBmYWxzZQogIGhhc19yb290X2RpcmVjdG9yeSgpLTogdHJ1ZQogIGhhc19yb290X3BhdGgoKS0tLS0tLTogdHJ1ZQogIGhhc19yZWxhdGl2ZV9wYXRoKCktLTogdHJ1ZQogIGhhc19wYXJlbnRfcGF0aCgpLS0tLTogdHJ1ZQogIGhhc19maWxlbmFtZSgpLS0tLS0tLTogdHJ1ZQogIGhhc19zdGVtKCktLS0tLS0tLS0tLTogdHJ1ZQogIGhhc19leHRlbnNpb24oKS0tLS0tLTogdHJ1ZTwvcHJlPgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgoKPHAgZGlyPSJsdHIiPlRoZXNlIGFyZSBwcmV0dHkgc2VsZi1ldmlkZW50LCBidXQgZG8gbm90ZSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgCnJlc3VsdCBvZiA8Y29kZT5pc19hYnNvbHV0ZSgpPC9jb2RlPiBiZXR3ZWVuIExpbnV4IGFuZCBXaW5kb3dzLiBCZWNhdXNlIHRoZXJlIGlzIApubyByb290IG5hbWUgKGkuZS4gZHJpdmUgc3BlY2lmaWVyIG9yIG5ldHdvcmsgbmFtZSksIGEgbG9uZSBzbGFzaCAob3IgYmFja3NsYXNoKSAKaXMgYSByZWxhdGl2ZSBwYXRoIG9uIFdpbmRvd3MuIDwvcD4KCjxwIGRpcj0ibHRyIj5PbiB0byBjb21wb3NpdGlvbiE8L3A+Cgo8cD5DbGFzcyA8Y29kZT5wYXRoPC9jb2RlPiB1c2VzIDxjb2RlPi88L2NvZGU+IGFuZCA8Y29kZT4vPTwvY29kZT4gb3BlcmF0b3JzIHRvIAphcHBlbmQgZWxlbWVudHMuIFRoYXQncyBhIHJlbWluZGVyIAp0aGF0IHRoZXNlIG9wZXJhdGlvbnMgYXBwZW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgcHJlZmVycmVkIGRpcmVjdG9yeSAKc2VwYXJhdG9yIGlmIG5lZWRlZC4gVGhlIHByZWZlcnJlZCAKZGlyZWN0b3J5IHNlcGFyYXRvciBpcyBhIHNsYXNoIG9uIFBPU0lYLWxpa2Ugc3lzdGVtcywgYW5kIGEgYmFja3NsYXNoIG9uIApXaW5kb3dzLWxpa2Ugc3lzdGVtcy48L3A+Cgo8cD48YSBocmVmPSIuLi9leGFtcGxlL3BhdGhfaW5mby5jcHAiPjxjb2RlPnBhdGhfaW5mby5jcHA8L2NvZGU+PC9hPiAKY29tcG9zZXMgYSBwYXRoIGJ5IGFwcGVuZGluZyBlYWNoIG9mIHRoZSBjb21tYW5kIGxpbmUgZWxlbWVudHMgdG8gYW4gaW5pdGlhbGx5IAplbXB0eSBwYXRoOjwvcD4KCjx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICA8dHI+CiAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICA8YmxvY2txdW90ZT4KICAgIDxwcmU+cGF0aCBwOyAgLy8gY29tcG9zZSBhIHBhdGggZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwoKZm9yICg7IGFyZ2MgJmd0OyAxOyAtLWFyZ2MsICsrYXJndikKICBwIC89IGFyZ3ZbMV07Cgpjb3V0ICZsdDsmbHQ7ICZxdW90O1xuY29tcG9zZWQgcGF0aDpcbiZxdW90OzsKY291dCAmbHQ7Jmx0OyAmcXVvdDsgY291dCAmbHQ7Jmx0OyAtLS0tLS0tLS0tLS0tOiAmcXVvdDsgJmx0OyZsdDsgcCAmbHQ7Jmx0OyAmcXVvdDtcbiZxdW90OzsKY291dCAmbHQ7Jmx0OyAmcXVvdDsgcHJlZmVycmVkKCktLS0tLS0tLS0tOiAmcXVvdDsgJmx0OyZsdDsgcC5wcmVmZXJyZWQoKSAmbHQ7Jmx0OyAmcXVvdDtcbiZxdW90Ozs8L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KCjxwPkxldCdzIGdpdmUgdGhpcyBjb2RlIGEgdHJ5OiA8L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIGJvcmRlcmNvbG9yPSIjMTExMTExIiBiZ2NvbG9yPSIjRDdFRUZGIiB3aWR0aD0iOTAlIj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI1MCUiIHN0eWxlPSJmb250LXNpemU6IDEwcHQiPjxpPjxiPlVidW50dSBMaW51eCA8L2I+PC9pPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij48aT48Yj5NaWNyb3NvZnQgV2luZG93czwvYj48L2k+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iNTAlIiBzdHlsZT0iZm9udC1zaXplOiAxMHB0Ij4KICAgICAgPHByZT4kIC4vcGF0aF9pbmZvIC8gZm9vL2JhciBiYWEudHh0Cgpjb21wb3NlZCBwYXRoOgogIGNvdXQgJmx0OyZsdDsgLS0tLS0tLS0tLS0tLTogL2Zvby9iYXIvYmFhLnR4dAogIHByZWZlcnJlZCgpLS0tLS0tLS0tLTogL2Zvby9iYXIvYmFhLnR4dDwvcHJlPgogICAgICA8L3RkPgogICAgICA8dGQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdCI+CiAgICAgIDxwcmU+Jmd0O3BhdGhfaW5mbyAvIGZvby9iYXIgYmFhLnR4dAoKY29tcG9zZWQgcGF0aDoKICBjb3V0ICZsdDsmbHQ7IC0tLS0tLS0tLS0tLS06IC9mb28vYmFyXGJhYS50eHQKICBwcmVmZXJyZWQoKS0tLS0tLS0tLS06IFxmb29cYmFyXGJhYS50eHQ8L3ByZT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KCiAgICA8cD4mbmJzcDs8L3A+CgogIDxocj4KCiAgPGgyPjxhIG5hbWU9IkVycm9yLXJlcG9ydGluZyI+RXJyb3IgcmVwb3J0aW5nPC9hPjwvaDI+CgogIDxwPlRoZSBCb29zdC5GaWxlc3lzdGVtIDxjb2RlPmZpbGVfc2l6ZTwvY29kZT4gZnVuY3Rpb24gaGFzIHR3byBvdmVybG9hZHM6PC9wPgoKICA8YmxvY2txdW90ZT4KICA8cHJlPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAiPnVpbnRtYXhfdDwvc3Bhbj4gPGEgbmFtZT0iZmlsZV9zaXplIj5maWxlX3NpemU8L2E+KGNvbnN0IHBhdGgmYW1wOyBwKTsKPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7ICI+dWludG1heF90PC9zcGFuPiA8YSBuYW1lPSJmaWxlX3NpemUyIj5maWxlX3NpemU8L2E+KGNvbnN0IHBhdGgmYW1wOyBwLCBzeXN0ZW06OmVycm9yX2NvZGUmYW1wOyBlYyk7PC9wcmU+CjwvYmxvY2txdW90ZT4KPHA+VGhlIG9ubHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgaG93IHRoZXkgcmVwb3J0IGVycm9ycy48L3A+CjxwPlRoZSAKICBmaXJzdCBzaWduYXR1cmUgd2lsbCB0aHJvdyBleGNlcHRpb25zIHRvIHJlcG9ydCBlcnJvcnMuIEEgPGNvZGU+CjxhIGhyZWY9InJlZmVyZW5jZS5odG1sI0NsYXNzLWZpbGVzeXN0ZW1fZXJyb3IiPmZpbGVzeXN0ZW1fZXJyb3I8L2E+PC9jb2RlPiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gCm9uIGFuIAogIG9wZXJhdGlvbmFsIGVycm9yLiA8Y29kZT5maWxlc3lzdGVtX2Vycm9yPC9jb2RlPiBpcyBkZXJpdmVkIGZyb20gPGNvZGU+c3RkOjpydW50aW1lX2Vycm9yPC9jb2RlPi4gCkl0IGhhcyBhIAogIG1lbWJlciBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIDxjb2RlPgo8YSBocmVmPSIuLi8uLi8uLi9zeXN0ZW0vZG9jL3JlZmVyZW5jZS5odG1sI0NsYXNzLWVycm9yX2NvZGUiPmVycm9yX2NvZGU8L2E+PC9jb2RlPiByZXBvcnRlZCBieSB0aGUgc291cmNlIAogIG9mIHRoZSBlcnJvci4gSXQgYWxzbyBoYXMgbWVtYmVyIGZ1bmN0aW9ucyB0byBvYnRhaW4gdGhlIHBhdGggb3IgcGF0aHMgdGhhdCBjYXVzZWQgCiAgdGhlIGVycm9yLjwvcD4KCiAgPGJsb2NrcXVvdGU+CgogIDxwPjxiPk1vdGl2YXRpb24gZm9yIHRoZSBzZWNvbmQgc2lnbmF0dXJlOjwvYj4gVGhyb3dpbmcgZXhjZXB0aW9ucyBvbiBlcnJvcnMgd2FzIHRoZSBlbnRpcmUgZXJyb3IgcmVwb3J0aW5nIHN0b3J5IGZvciB0aGUgZWFybGllc3QgdmVyc2lvbnMgb2YgCiAgQm9vc3QuRmlsZXN5c3RlbSwgYW5kIGluZGVlZCB0aHJvd2luZyBleGNlcHRpb25zIG9uIGVycm9ycyB3b3JrcyB2ZXJ5IHdlbGwgZm9yIAogIG1hbnkgYXBwbGljYXRpb25zLiBCdXQgdXNlciByZXBvcnRzIHRyaWNrbGVkIGluIHRoYXQgc29tZSBjb2RlIGJlY2FtZSBzbyAKICBsaXR0ZXJlZCB3aXRoIHRyeSBhbmQgY2F0Y2ggYmxvY2tzIGFzIHRvIGJlIHVucmVhZGFibGUgYW5kIHVubWFpbnRhaW5hYmxlLiBJbiAKICBzb21lIGFwcGxpY2F0aW9ucyBJL08gZXJyb3JzIGFyZW4ndCBleGNlcHRpb25hbCwgYW5kIHRoYXQncyB0aGUgdXNlIGNhc2UgZm9yIAogIHRoZSBzZWNvbmQgc2lnbmF0dXJlLjwvcD4KCiAgPC9ibG9ja3F1b3RlPgoKICA8cD5GdW5jdGlvbnMgd2l0aCBhIDxjb2RlPnN5c3RlbTo6ZXJyb3JfY29kZSZhbXA7PC9jb2RlPiBhcmd1bWVudCBzZXQgdGhhdCAKICBhcmd1bWVudCB0byByZXBvcnQgb3BlcmF0aW9uYWwgZXJyb3Igc3RhdHVzLCBhbmQgc28gZG8gbm90IHRocm93IGV4Y2VwdGlvbnMgd2hlbiBJL08gCiAgcmVsYXRlZCBlcnJvcnMgb2NjdXIuIEZvciBhIGZ1bGwgZXhwbGFuYXRpb24sIHNlZQogIDxhIGhyZWY9InJlZmVyZW5jZS5odG1sI0Vycm9yLXJlcG9ydGluZyI+RXJyb3IgcmVwb3J0aW5nPC9hPiBpbiB0aGUgcmVmZXJlbmNlIAogIGRvY3VtZW50YXRpb24uIDwvcD4KCjxocj4KPHA+qSBDb3B5cmlnaHQgQmVtYW4gRGF3ZXMgMjAxMDwvcD4KPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiBTZWUKPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT48L3A+CjxwPlJldmlzZWQKPCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgUy1UeXBlPSJFRElURUQiIFMtRm9ybWF0PSIlZCAlQiAlWSIgc3RhcnRzcGFuIC0tPjA0IEp1bmUgMjAxMDwhLS13ZWJib3QgYm90PSJUaW1lc3RhbXAiIGVuZHNwYW4gaS1jaGVja3N1bT0iMTc1NTAiIC0tPjwvcD4KCjwvYm9keT4KCjwvaHRtbD4=