PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPjxodG1sPjxoZWFkPjx0aXRsZT5BcGFjaGUgQXhpczIvQyAtIEFwYWNoZSBBeGlzMi9DIC0gQ29kaW5nIENvbnZlbnRpb25zPC90aXRsZT48c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJhbGwiPgogICAgICAgICAgQGltcG9ydCB1cmwoIi4vc3R5bGUvbWF2ZW4tYmFzZS5jc3MiKTsKICAgICAgICAgIAoJCQkgICAgQGltcG9ydCB1cmwoIi4vc3R5bGUvbWF2ZW4tY2xhc3NpYy5jc3MiKTs8L3N0eWxlPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi9zdHlsZS9wcmludC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0icHJpbnQiPjwvbGluaz48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L21ldGE+PC9oZWFkPjxib2R5IGNsYXNzPSJjb21wb3NpdGUiPjxkaXYgaWQ9ImJhbm5lciI+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgaWQ9Im9yZ2FuaXphdGlvbkxvZ28iPjxpbWcgYWx0PSJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgc3JjPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW1hZ2VzL2FzZi1sb2dvLmdpZiI+PC9pbWc+PC9hPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2MiIGlkPSJwcm9qZWN0TG9nbyI+PGltZyBhbHQ9IkFwYWNoZSBBeGlzMi9DIiBzcmM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ltYWdlcy9heGlzLmpwZyI+PC9pbWc+PC9hPjxkaXYgY2xhc3M9ImNsZWFyIj48aHI+PC9ocj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJicmVhZGNydW1icyI+PGRpdiBjbGFzcz0ieGxlZnQiPgogICAgICAgICAgICAgICAgCUxhc3QgcHVibGlzaGVkOiAxNyBBcHJpbCAyMDA5CiAgICAgICAgICAgICAgICAgIHwgRG9jIGZvciAxLjYuMDwvZGl2PjxkaXYgY2xhc3M9InhyaWdodCI+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjxocj48L2hyPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImxlZnRDb2x1bW4iPjxkaXYgaWQ9Im5hdmNvbHVtbiI+PGRpdiBpZD0ibWVudUFwYWNoZV9BeGlzMl9DIj48aDU+QXBhY2hlIEF4aXMyL0M8L2g1Pjx1bD48bGkgY2xhc3M9Im5vbmUiPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkFwYWNoZSBBeGlzMi9DIEhvbWU8L2E+PC9saT48bGkgY2xhc3M9ImV4cGFuZGVkIj48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9jL2Rvd25sb2FkLmNnaSIgY2xhc3M9ImV4dGVybmFsTGluayIgdGl0bGU9IkV4dGVybmFsIExpbmsiPkRvd25sb2FkIEF4aXMyL0M8L2E+PHVsPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYy9kb3dubG9hZC5jZ2kiIGNsYXNzPSJleHRlcm5hbExpbmsiIHRpdGxlPSJFeHRlcm5hbCBMaW5rIj5SZWxlYXNlczwvYT48L2xpPjwvdWw+PC9saT48bGkgY2xhc3M9ImV4cGFuZGVkIj48YSBocmVmPSJkb2NzL2luZGV4Lmh0bWwiPkRvY3VtZW50YXRpb248L2E+PHVsPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iZG9jcy9pbnN0YWxsYXRpb25ndWlkZS5odG1sIj5JbnN0YWxsYXRpb24gR3VpZGU8L2E+PC9saT48bGkgY2xhc3M9Im5vbmUiPjxhIGhyZWY9ImRvY3MvYXhpczJjX21hbnVhbC5odG1sIj5BeGlzMi9DIG1hbnVhbDwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iZG9jcy9mYXEuaHRtbCI+QXhpczIvQyBGQVE8L2E+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJleHBhbmRlZCI+PGEgaHJlZj0ibGlzdHNfaXNzdWVzLmh0bWwiPkdldCBJbnZvbHZlZDwvYT48dWw+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSJsaXN0c19pc3N1ZXMuaHRtbCI+TWFpbGluZyBMaXN0cyAmYW1wOyBJc3N1ZSBUcmFja2luZzwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0ic3ZuLmh0bWwiPkNoZWNrb3V0IFNvdXJjZSBDb2RlPC9hPjwvbGk+PC91bD48L2xpPjxsaSBjbGFzcz0iZXhwYW5kZWQiPjxhIGhyZWY9ImNvZGluZ19jb252ZW50aW9ucy5odG1sIj5EZXZlbG9wZXIgR3VpZGVsaW5lczwvYT48dWw+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSJjb2RpbmdfY29udmVudGlvbnMuaHRtbCI+Q29kaW5nIENvbnZlbnRpb248L2E+PC9saT48bGkgY2xhc3M9Im5vbmUiPjxhIGhyZWY9InZlcnNpb25pbmcuaHRtbCI+VmVyc2lvbm5pbmc8L2E+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJleHBhbmRlZCI+PGEgaHJlZj0idGVhbS1saXN0Lmh0bWwiPlByb2plY3QgSW5mb3JtYXRpb248L2E+PHVsPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0idGVhbS1saXN0Lmh0bWwiPlByb2plY3QgVGVhbTwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2MvIiBjbGFzcz0iZXh0ZXJuYWxMaW5rIiB0aXRsZT0iRXh0ZXJuYWwgTGluayI+U291cmNlIENvZGU8L2E+PC9saT48L3VsPjwvbGk+PC91bD48L2Rpdj48YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iIHRpdGxlPSJCdWlsdCBieSBNYXZlbiIgaWQ9InBvd2VyZWRCeSI+PGltZyBhbHQ9IkJ1aWx0IGJ5IE1hdmVuIiBzcmM9Ii4vaW1hZ2VzL2xvZ29zL21hdmVuLWJ1dHRvbi0xLnBuZyI+PC9pbWc+PC9hPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImJvZHlDb2x1bW4iPjxkaXYgY2xhc3M9ImNvbnRlbnRCb3giPjxkaXYgY2xhc3M9InNlY3Rpb24iPjxhIG5hbWU9IkF4aXMyX0NfQ29kaW5nX0NvbnZlbnRpb25zIj48L2E+PGgyPkF4aXMyL0MgQ29kaW5nIENvbnZlbnRpb25zPC9oMj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSJDb250ZW50cyI+PC9hPjxoMz5Db250ZW50czwvaDM+PHVsPgogIDxsaT48YSBocmVmPSIjMV9OYW1pbmdfY29udmVudGlvbnNfIj5OYW1pbmcgQ29udmVudGlvbnM8L2E+CiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSIjMV8xX1ZhcmlhYmxlcyI+VmFyaWFibGVzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjMV8yX0Z1bmN0aW9uc18iPkZ1bmN0aW9uczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iIzFfM19TdHJ1Y3R1cmVzX2FuZF91c2VyX2RlZmluZWRfZGF0YSI+U3RydWN0dXJlcyBhbmQgVXNlcgogICAgICAgIGRlZmluZWQgRGF0YSBUeXBlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iIzFfNF9NYWNyb3MiPk1hY3JvczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iIzFfNV9FbnVtZXJhdGlvbnMiPkVudW1lcmF0aW9uczwvYT48L2xpPgogICAgPC91bD4KICA8L2xpPgogIDxsaT48YSBocmVmPSIjMl9JbmRlbnRhdGlvbiI+SW5kZW50YXRpb24gYW5kIEZvcm1hdHRpbmc8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iIzNfQ29tbWVudHMiPkNvbW1lbnRzPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiM0X0Z1bmN0aW9uX3BhcmFtZXRlcnNfYW5kX1JldHVybl9WYWx1ZSI+RnVuY3Rpb24gUGFyYW1ldGVycwogICAgYW5kIFJldHVybiBWYWx1ZSBDb252ZW50aW9uczwvYT48L2xpPgogIDxsaT48YSBocmVmPSIjNV9JbmNsdWRlX2RpcmVjdGl2ZXMiPkluY2x1ZGUgRGlyZWN0aXZlczwvYT48L2xpPgo8L3VsPjxwPjxhIG5hbWU9IjFfTmFtaW5nX2NvbnZlbnRpb25zXyI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSIxX19OYW1pbmdfQ29udmVudGlvbnMiPjwvYT48aDM+MS4gTmFtaW5nIENvbnZlbnRpb25zPC9oMz48dWw+CiAgPGxpPk5hbWVzcGFjZSB2YWxpZGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlCiAgICA8Y29kZT48c3Ryb25nPmF4aXMyXzwvc3Ryb25nPjwvY29kZT4gcHJlZml4LjwvbGk+CiAgPGxpPlVuZGVyc2NvcmUgc2hvdWxkIGJlIHVzZWQgdG8gc2VwYXJhdGUgaW5kaXZpZHVhbCB3b3JkcyBpbgogIGlkZW50aWZpZXJzLjwvbGk+CiAgPGxpPkFsbCBpZGVudGlmaWVycyBzaG91bGQgYmUgbWVhbmluZ2Z1bCBhbmQgYWJicmV2aWF0aW9ucyBtdXN0IGJlIGF2b2lkZWQKICAgIHdoZW5ldmVyIHBvc3NpYmxlLjwvbGk+CjwvdWw+PHA+PGEgbmFtZT0iMV8xX1ZhcmlhYmxlcyI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSIxXzFfVmFyaWFibGVzIj48L2E+PGgzPjEuMSBWYXJpYWJsZXM8L2gzPjx1bD4KICA8bGk+VXNlIG1lYW5pbmdmdWwgbm91bnMuPC9saT4KICA8bGk+TWFrZSBzdXJlIHRvIHVzZSBhbGwgbG93ZXJjYXNlIGxldHRlcnMgZm9yIHByaXZhdGUgYW5kIHB1YmxpYwogIHZhcmlhYmxlcy48L2xpPgogIDxsaT5JZiBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9yIGEgbWVtYmVyIG9mIGEgc3RydWN0LCB0aGVyZSdzIG5vIG5lZWQgdG8KICAgIHByZWZpeCBpdCB3aXRoIDxjb2RlPmF4aXMyXzwvY29kZT48L2xpPgogIGUuZy48L3VsPgogICAgPGRpdiBjbGFzcz0ic291cmNlIj48cHJlPmludCBjb3VudCA9IDA7CmNoYXIgKnByZWZpeCA9IE5VTEw7CjwvcHJlPjwvZGl2PgogIDxwPjxhIG5hbWU9IjFfMl9GdW5jdGlvbnNfIj48L2E+PC9wPjwvZGl2PjxkaXYgY2xhc3M9InN1YnNlY3Rpb24iPjxhIG5hbWU9IjFfMl9GdW5jdGlvbnMiPjwvYT48aDM+MS4yIEZ1bmN0aW9uczwvaDM+PHVsPgogIDxsaT5GdW5jdGlvbiBuYW1lcyBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggdGhlIHByZWZpeCA8Y29kZT5heGlzMl88L2NvZGU+CiAgICBleGNlcHQgZm9yIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuPC9saT4KICBlLmcuPC91bD4KICAgIDxkaXYgY2xhc3M9InNvdXJjZSI+PHByZT5heGlzMl9lbmdpbmVfdCAqIGF4aXMyX2VuZ2luZV9jcmVhdGUoYXh1dGlsX2Vudl90ICplbnZpcm9ubWVudCk7CjwvcHJlPjwvZGl2PgogIDxwPjxhIG5hbWU9IjFfM19TdHJ1Y3R1cmVzX2FuZF91c2VyX2RlZmluZWRfZGF0YSI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSIxXzNfU3RydWN0dXJlc19hbmRfVXNlcl9EZWZpbmVkX0RhdGFfVHlwZXMiPjwvYT48aDM+MS4zIFN0cnVjdHVyZXMgYW5kIFVzZXIgRGVmaW5lZCBEYXRhIFR5cGVzPC9oMz48dWw+CiAgPGxpPk5vdGUgdGhlIF90IHN1ZmZpeCBpbiB0aGUgdHlwZSBuYW1lLjwvbGk+CiAgZS5nLjwvdWw+CiAgICA8ZGl2IGNsYXNzPSJzb3VyY2UiPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgYXhpczJfZW5kcG9pbnRfcmVmIHsKICAgIGF4aXMyX2NoYXJfdCAqYWRkcmVzczsKfSBheGlzMl9lbmRwb2ludF9yZWZfdDsKPC9wcmU+PC9kaXY+CiAgPHA+PGEgbmFtZT0iMV80X01hY3JvcyI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSIxXzRfTWFjcm9zIj48L2E+PGgzPjEuNCBNYWNyb3M8L2gzPjx1bD4KICA8bGk+TWFjcm8gbmFtZXMgc2hvdWxkIGJlIGluIGFsbCB1cHBlcmNhc2UgbGV0dGVycy48L2xpPgogIGUuZy48L3VsPgogICAgPGRpdiBjbGFzcz0ic291cmNlIj48cHJlPiNkZWZpbmUgQVhJUzJfSAojZGVmaW5lIEFYSVMyX0VSUk9SX0dFVF9NRVNTQUdFKGVycm9yKSAoKGVycm9yKS0mZ3Q7b3BzLSZndDtnZXRfbWVzc2FnZShlcnJvcikpCgo8L3ByZT48L2Rpdj4KICA8cD48YSBuYW1lPSIxXzVfRW51bWVyYXRpb25zIj48L2E+PC9wPjwvZGl2PjxkaXYgY2xhc3M9InN1YnNlY3Rpb24iPjxhIG5hbWU9IjFfNV9FbnVtZXJhdGlvbnMiPjwvYT48aDM+MS41IEVudW1lcmF0aW9uczwvaDM+PHVsPgogIGUuZy48L3VsPgogICAgPGRpdiBjbGFzcz0ic291cmNlIj48cHJlPnR5cGVkZWYgZW51bSBheGlzMl9zdGF0dXNfY29kZXMgeyAgCiAgICBBWElTMl9GQUlMVVJFID0gMCwKICAgIEFYSVMyX1NVQ0NFU1MKfSBheGlzMl9zdGF0dXNfY29kZXNfdDsKPC9wcmU+PC9kaXY+CiAgPHA+PGEgbmFtZT0iMl9JbmRlbnRhdGlvbiI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSIyX19JbmRlbnRhdGlvbl9hbmRfRm9ybWF0dGluZyI+PC9hPjxoMz4yLiBJbmRlbnRhdGlvbiBhbmQgRm9ybWF0dGluZzwvaDM+PHVsPgogIEluZGVudGF0aW9uIHJ1bGVzIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIDxhIGhyZWY9Imh0dHA6Ly9hc3R5bGUuc291cmNlZm9yZ2UubmV0LyIgY2xhc3M9ImV4dGVybmFsTGluayIgdGl0bGU9IkV4dGVybmFsIExpbmsiPkFydGlzdGljIFN0eWxlPC9hPiBpbmRlbnQKb3B0aW9uczo8L3VsPjx1bD4KICAKICBhc3R5bGUgLS1zdHlsZT1hbnNpICAtYiAtcCAtczQgIC1NMCAtYyAtVSAtUzwvdWw+PHVsPgogIEluIGRldGFpbCwgdGhlc2Ugb3B0aW9ucyBtZWFuLAogIDx1bD4KICAgIDxsaT5Vc2UgdGhlIEFOU0kgc3R5bGUgY29kZSBsYXlvdXQKICAgICAgPHByZT4gICAgICAgICAgICBpbnQgZm9vKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzX2JhcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBiYXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICA8L3ByZT4KICAgIDwvbGk+CiAgICA8bGk+VXNlIHNwYWNlcyBhcm91bmQgb3BlcmF0b3JzPC9saT4KICAgIDxsaT5Vc2UgZm91ciBzcGFjZXMgZm9yIGluZGVudGluZzwvbGk+CiAgICA8bGk+Tm8gc3BhY2VzIGJldHdlZW4gdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHBhcmVudGhlc2lzCiAgICAgIDxwcmU+ICAgICAgICAgICAgaWYgKGlzX2ZvbyhhLCBiKSkKICAgICAgICAgICAgICAgIGJhcihhLCBiKTsKICAgICAgICAgICAgPC9wcmU+CiAgICAgIDxwcmU+ICAgICAgICA8L3ByZT4KICAgIDwvbGk+CiAgPC91bD4KICBUaGVyZSBhcmUgc29tZSBtb3JlIGZvcm1hdHRpbmcgZ3VpZGVsaW5lcyB0aGF0IGNvdWxkIG5vdCBiZSBlbmZvcmNlZCBieSBhCiAgZm9ybWF0dGluZyB0b29sLCBidXQgbmV2ZXJ0aGVsZXNzIHNob3VsZCBiZSBmb2xsb3dlZC4KICA8dWw+CiAgICA8bGk+Q2hlY2tpbmcgcG9pbnRlciB2YWxpZGl0eToKICAgICAgPHByZT4gICAgaWYgKGZvbyk8L3ByZT4KICAgICAgYW5kIE5PVAogICAgICA8cHJlPiAgICBpZiAoZm9vICE9IE5VTEwpPC9wcmU+CiAgICA8L2xpPgogICAgPGxpPkNoZWNraW5nIGVxdWFsaXR5OgogICAgICA8cHJlPiAgICBpZiAoZm9vID09IDcpPC9wcmU+CiAgICAgIGFuZCBOT1QKICAgICAgPHByZT4gICAgaWYgKDcgPT0gZm9vKTwvcHJlPgogICAgPC9saT4KICA8L3VsPgo8L3VsPjxwPjxhIG5hbWU9IjNfQ29tbWVudHMiPjwvYT48L3A+PC9kaXY+PGRpdiBjbGFzcz0ic3Vic2VjdGlvbiI+PGEgbmFtZT0iM19fQ29tbWVudHMiPjwvYT48aDM+My4gQ29tbWVudHM8L2gzPjx1bD4KICA8YSBocmVmPSJodHRwOi8vd3d3LnN0YWNrLm5sLyU3RWRpbWl0cmkvZG94eWdlbi9kb2NibG9ja3MuaHRtbCIgY2xhc3M9Im5ld1dpbmRvdyIgdGl0bGU9Ik5ldyBXaW5kb3ciIHRhcmdldD0iX2JsYW5rIj5Eb3h5Z2VuIHN0eWxlIGNvbW1lbnRzPC9hPiBzaG91bGQgYmUgdXNlZCB0byBoZWxwIGF1dG8KICBnZW5lcmF0ZSBBUEkgZG9jdW1lbnRhdGlvbi4gQWxsIHN0cnVjdHMgYW5kIGZ1bmN0aW9ucyBpbmNsdWRpbmcgcGFyYW1ldGVycwogIGFuZCByZXR1cm4gdHlwZXMgc2hvdWxkIGJlIGRvY3VtZW50ZWQuPC91bD48cD48YSBuYW1lPSI0X0Z1bmN0aW9uX3BhcmFtZXRlcnNfYW5kX1JldHVybl9WYWx1ZSI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSI0X19GdW5jdGlvbl9QYXJhbWV0ZXJzX2FuZF9SZXR1cm5fVmFsdWVfQ29udmVudGlvbnMiPjwvYT48aDM+NC4gRnVuY3Rpb24gUGFyYW1ldGVycyBhbmQgUmV0dXJuIFZhbHVlIENvbnZlbnRpb25zPC9oMz48dWw+CiAgRWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgcGFzc2VkIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiB0aGUKICA8Y29kZT5heHV0aWxfZW52X3Q8L2NvZGU+IHN0cnVjdCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLiBJZiB0aGUKICBmdW5jdGlvbiBpcyB0aWdodGx5IGJvdW5kIHRvIGEgc3RydWN0LCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8KICBhbiBpbnN0YW5jZSBvZiB0aGF0IHN0cnVjdC48L3VsPjx1bD4KICBGdW5jdGlvbnMgcmV0dXJuaW5nIHBvaW50ZXJzIHNob3VsZCByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGFuIGVycm9yLiBUaGUKICBkZXZlbG9wZXIgc2hvdWxkIG1ha2Ugc3VyZSB0byBzZXQgdGhlIHJlbGV2YW50IGVycm9yIGNvZGUgaW4gdGhlCiAgZW52aXJvbm1lbnQncyBlcnJvciBzdHJ1Y3QuPC91bD48dWw+CiAgRnVuY3Rpb25zIHRoYXQgZG8gbm90IHJldHVybiBwb2ludGVyIHZhbHVlcyBzaG91bGQgYWx3YXlzIHJldHVybiB0aGUKICA8Y29kZT5BWElTMl9GQUlMVVJFPC9jb2RlPiBzdGF0dXMgY29kZSBvbiBlcnJvciB3aGVuZXZlciBwb3NzaWJsZSwgb3IKICByZXR1cm4gc29tZSBvdGhlciBkZWZpbmVkIGVycm9yIHZhbHVlIChpbiBjYXNlIG9mIHJldHVybmluZyBhIHN0cnVjdAogIHBlcmhhcHMpLiBBIHJlbGV2YW50IGVycm9yIGNvZGUgbXVzdCBhbHNvIGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQncyBlcnJvcgogIHN0cnVjdC48L3VsPjxwPjxhIG5hbWU9IjVfSW5jbHVkZV9kaXJlY3RpdmVzIj48L2E+PC9wPjwvZGl2PjxkaXYgY2xhc3M9InN1YnNlY3Rpb24iPjxhIG5hbWU9IjVfX0luY2x1ZGVfRGlyZWN0aXZlcyI+PC9hPjxoMz41LiBJbmNsdWRlIERpcmVjdGl2ZXM8L2gzPjx1bD4KICBJdCBpcyBwcmVmZXJhYmxlIHRvIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjo8L3VsPjx1bD4KPC91bD4KICAgIDxkaXYgY2xhc3M9InNvdXJjZSI+PHByZT4mbHQ7c3RhbmRhcmQgaGVhZGVyIGZpbGVzJmd0OwombHQ7b3RoZXIgc3lzdGVtIGhlYWRlcnMmZ3Q7CiJsb2NhbCBoZWFkZXIgZmlsZXMiCgoKCjwvcHJlPjwvZGl2PgogIDwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48aHI+PC9ocj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PGhyPjwvaHI+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj48ZGl2IGNsYXNzPSJ4cmlnaHQiPqkgMjAwNS0yMDA5LCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48aHI+PC9ocj48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPg==