CmRubApkbmwgR0xJQkNYWF9DT05ESVRJT05BTCAoTkFNRSwgU0hFTEwtVEVTVCkKZG5sCmRubCBFeGFjdGx5IGxpa2UgQU1fQ09ORElUSU9OQUwsIGJ1dCBkZWxheXMgZXZhbHVhdGlvbiBvZiB0aGUgdGVzdCB1bnRpbCB0aGUKZG5sIGVuZCBvZiBjb25maWd1cmUuICBUaGlzIGxldHMgdGVzdGVkIHZhcmlhYmxlcyBiZSByZWFzc2lnbmVkLCBhbmQgdGhlCmRubCBjb25kaXRpb25hbCB3aWxsIGRlcGVuZCBvbiB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIHZhcmlhYmxlLiAgRm9yIGEgc2ltcGxlCmRubCBleGFtcGxlIG9mIHdoeSB0aGlzIGlzIG5lZWRlZCwgc2VlIEdMSUJDWFhfRU5BQkxFX0hPU1RFRC4KZG5sCm00X2RlZmluZShbX200X2RpdmVydChnbGliY3h4X2RpdmVyc2lvbildLCA4MDAwKWRubApBQ19ERUZVTihbR0xJQkNYWF9DT05ESVRJT05BTF0sIFtkbmwKICBtNF9kaXZlcnRfdGV4dChbZ2xpYmN4eF9kaXZlcnNpb25dLGRubAogICBBTV9DT05ESVRJT05BTChbJDFdLFskMl0pCiAgKWRubApdKWRubApBQ19ERUZVTihbR0xJQkNYWF9FVkFMVUFURV9DT05ESVRJT05BTFNdLCBbbTRfdW5kaXZlcnQoW2dsaWJjeHhfZGl2ZXJzaW9uXSldKWRubAoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIHdoYXQgYXJjaGl0ZWN0dXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHdlIGFyZSBjb21waWxpbmcKZG5sIGZvci4gIEFsc28sIGlmIGFyY2hpdGVjdHVyZS0gb3IgT1Mtc3BlY2lmaWMgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvcgpkbmwgY29tcGlsYXRpb24sIHBpY2sgdGhlbSB1cCBoZXJlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSE9TVF0sIFsKICAuICRnbGliY3h4X3NyY2Rpci9jb25maWd1cmUuaG9zdAogIEFDX01TR19OT1RJQ0UoW0NQVSBjb25maWcgZGlyZWN0b3J5IGlzICRjcHVfaW5jbHVkZV9kaXJdKQogIEFDX01TR19OT1RJQ0UoW09TIGNvbmZpZyBkaXJlY3RvcnkgaXMgJG9zX2luY2x1ZGVfZGlyXSkKXSkKCmRubApkbmwgSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSBjb25maWd1cnkuICBBdCB0aGlzIHBvaW50IHdlIGhhdmUKZG5sIHZhcmlhYmxlcyBsaWtlICRob3N0LgpkbmwKZG5sIFNldHM6CmRubCAgU1VCRElSUwpkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfYnVpbGRkaXIgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIGdsaWJjeHhfc3JjZGlyICAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHRvcGxldmVsX3NyY2RpciAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHdpdGhfY3Jvc3NfaG9zdApkbmwgIHdpdGhfbmV3bGliCmRubCAgd2l0aF90YXJnZXRfc3ViZGlyCmRubCBwbHVzCmRubCAgLSB0aGUgdmFyaWFibGVzIGluIEdMSUJDWFhfQ0hFQ0tfSE9TVCAvIGNvbmZpZ3VyZS5ob3N0CmRubCAgLSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgQU1fQ09ORklUSU9OQUwgdGVzdCB2YXJpYWJsZXMKZG5sICAtIGxvdHMgb2YgdG9vbHMsIGxpa2UgQ0MgYW5kIENYWApkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFXSwgWwogICMgS2VlcCB0aGVzZSBzeW5jJ2Qgd2l0aCB0aGUgbGlzdCBpbiBNYWtlZmlsZS5hbS4gIFRoZSBmaXJzdCBwcm92aWRlcyBhbgogICMgZXhwYW5kYWJsZSBsaXN0IGF0IGF1dG9jb25mIHRpbWU7IHRoZSBzZWNvbmQgcHJvdmlkZXMgYW4gZXhwYW5kYWJsZSBsaXN0CiAgIyAoaS5lLiwgc2hlbGwgdmFyaWFibGUpIGF0IGNvbmZpZ3VyZSB0aW1lLgogIG00X2RlZmluZShbZ2xpYmN4eF9TVUJESVJTXSxbaW5jbHVkZSBsaWJtYXRoIGxpYnN1cGMrKyBzcmMgcG8gdGVzdHN1aXRlXSkKICBTVUJESVJTPSdnbGliY3h4X1NVQkRJUlMnCgogICMgVGhlc2UgbmVlZCB0byBiZSBhYnNvbHV0ZSBwYXRocywgeWV0IGF0IHRoZSBzYW1lIHRpbWUgbmVlZCB0bwogICMgY2Fub25pY2FsaXplIG9ubHkgcmVsYXRpdmUgcGF0aHMsIGJlY2F1c2UgdGhlbiBhbWQgd2lsbCBub3QgdW5tb3VudAogICMgZHJpdmVzLiBUaHVzIHRoZSB1c2Ugb2YgUFdEQ01EOiBzZXQgaXQgdG8gJ3Bhd2QnIG9yICdhbXEgLXcnIGlmIHVzaW5nIGFtZC4KICBnbGliY3h4X2J1aWxkZGlyPWAke1BXRENNRC1wd2R9YAogIGNhc2UgJHNyY2RpciBpbgogICAgW1xcLyRdKiB8ID86W1xcL10qKSBnbGliY3h4X3NyY2Rpcj0ke3NyY2Rpcn0gOzsKICAgICopIGdsaWJjeHhfc3JjZGlyPWBjZCAiJHNyY2RpciIgJiYgJHtQV0RDTUQtcHdkfSB8fCBlY2hvICIkc3JjZGlyImAgOzsKICBlc2FjCiAgdG9wbGV2ZWxfc3JjZGlyPSR7Z2xpYmN4eF9zcmNkaXJ9Ly4uCiAgQUNfU1VCU1QoZ2xpYmN4eF9idWlsZGRpcikKICBBQ19TVUJTVChnbGliY3h4X3NyY2RpcikKICBBQ19TVUJTVCh0b3BsZXZlbF9zcmNkaXIpCgogICMgV2UgdXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9ucyB0byBpbmNsdWRlLiAgVGhleSBhcmUKICAjIHNldCBmcm9tIHRoZSB0b3AgbGV2ZWwuCiAgQUNfQVJHX1dJVEgoW3RhcmdldC1zdWJkaXJdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUl0sCiAgICAgICAgICAgICAgICAgICBbY29uZmlndXJpbmcgaW4gYSBzdWJkaXJlY3RvcnldKSkKCiAgQUNfQVJHX1dJVEgoW2Nyb3NzLWhvc3RdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jcm9zcy1ob3N0PUhPU1RdLAogICAgICAgICAgICAgICAgICAgW2NvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcl0pKQoKICBBQ19BUkdfV0lUSChbbmV3bGliXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbmV3bGliXSwKICAgICAgICAgICAgICAgICAgIFthc3N1bWUgbmV3bGliIGFzIGEgc3lzdGVtIEMgbGlicmFyeV0pKQoKICAjIFdlJ3JlIGFsbW9zdCBjZXJ0YWlubHkgYmVpbmcgY29uZmlndXJlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB3aGljaCB1c2VzCiAgIyBDKyssIHNvIGFsbCBvZiBvdXIgQUNfUFJPR18qIGRpc2NvdmVyaWVzIHdpbGwgYmUgY2FjaGVkLiAgSXQncyB2aXRhbCB0aGF0CiAgIyB3ZSBub3QgY2FjaGUgdGhlIHZhbHVlIG9mIENYWCB0aGF0IHdlICJkaXNjb3ZlciIgaGVyZSwgYmVjYXVzZSBpdCdzIHNldAogICMgdG8gc29tZXRoaW5nIHVuaXF1ZSBmb3IgdXMgYW5kIGxpYmphdmEuICBPdGhlciB0YXJnZXQgbGlicmFyaWVzIG5lZWQgdG8KICAjIGZpbmQgQ1hYIGZvciB0aGVtc2VsdmVzLiAgV2UgeWFuayB0aGUgcnVnIG91dCBmcm9tIHVuZGVyIHRoZSBub3JtYWwgQUNfKgogICMgcHJvY2VzcyBieSBzbmVha2lseSByZW5hbWluZyB0aGUgY2FjaGUgdmFyaWFibGUuICBUaGlzIGFsc28gbGV0cyB1cyBkZWJ1ZwogICMgdGhlIHZhbHVlIG9mICJvdXIiIENYWCBpbiBwb3N0bW9ydGVtcy4KICAjCiAgIyBXZSBtdXN0IGFsc28gZm9yY2UgQ1hYIHRvIC9ub3QvIGJlIGEgcHJlY2lvdXMgdmFyaWFibGUsIG90aGVyd2lzZSB0aGUKICAjIHdyb25nIChub24tbXVsdGlsaWItYWRqdXN0ZWQpIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBtdWx0aWxpYnMuICBUaGlzCiAgIyBsaXR0bGUgdHJpY2sgYWxzbyBhZmZlY3RzIENQUEZMQUdTLCBDWFhGTEFHUywgYW5kIExERkxBR1MuICBBbmQgYXMgYSBzaWRlCiAgIyBlZmZlY3QsIENYWEZMQUdTIGlzIG5vIGxvbmdlciBhdXRvbWFnaWNhbGx5IHN1YnN0J2QsIHNvIHdlIGhhdmUgdG8gZG8KICAjIHRoYXQgb3Vyc2VsdmVzLiAgVW4tcHJlY2lvdXNpbmcgQUNfUFJPR19DQyBhbHNvIGFmZmVjdHMgQ0MgYW5kIENGTEFHUy4KICAjCiAgIyAtZm5vLWJ1aWx0aW4gbXVzdCBiZSBwcmVzZW50IGhlcmUgc28gdGhhdCBhIG5vbi1jb25mbGljdGluZyBmb3JtIG9mCiAgIyBzdGQ6OmV4aXQgY2FuIGJlIGd1ZXNzZWQgYnkgQUNfUFJPR19DWFgsIGFuZCB1c2VkIGluIGxhdGVyIHRlc3RzLgoKICBtNF9kZWZpbmUoW2FjX2N2X3Byb2dfQ1hYXSxbZ2xpYmN4eF9jdl9wcm9nX0NYWF0pCiAgbTRfcmVuYW1lKFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10sW2dsaWJjeHhfUFJFQ0lPVVNdKQogIG00X2RlZmluZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdLFtdKQogIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tYnVpbHRpbiIKICBBQ19QUk9HX0NDCiAgQUNfUFJPR19DWFgKICBDWFhGTEFHUz0iJHNhdmVfQ1hYRkxBR1MiCiAgbTRfcmVuYW1lKFtnbGliY3h4X1BSRUNJT1VTXSxbX0FDX0FSR19WQVJfUFJFQ0lPVVNdKQogIEFDX1NVQlNUKENGTEFHUykKICBBQ19TVUJTVChDWFhGTEFHUykKCiAgIyBXaWxsIHNldCBMTl9TIHRvIGVpdGhlciAnbG4gLXMnLCAnbG4nLCBvciAnY3AgLXAnIChpZiBsaW5raW5nIGlzbid0CiAgIyBhdmFpbGFibGUpLiAgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZm9yY2UgYSBwYXJ0aWN1bGFyIG1ldGhvZC4KICBBQ19QUk9HX0xOX1MKICAjTE5fUz0nY3AgLXAnCgogIEFDX0NIRUNLX1RPT0woQVMsIGFzKQogIEFDX0NIRUNLX1RPT0woQVIsIGFyKQogIEFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIHJhbmxpYi1ub3QtZm91bmQtaW4tcGF0aC1lcnJvcikKCiAgQU1fTUFJTlRBSU5FUl9NT0RFCgogICMgU2V0IHVwIHNhZmUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBzdWJzZXF1ZW50IEFNX0NPTkRJVElPTkFMIHRlc3RzCiAgIyB3aGljaCBhcmUgdGhlbXNlbHZlcyBjb25kaXRpb25hbGx5IGV4cGFuZGVkLgogICMjIChSaWdodCBub3csIHRoaXMgb25seSBtYXR0ZXJzIGZvciBlbmFibGVfd2NoYXJfdCwgYnV0IG5vdGhpbmcgcHJldmVudHMKICAjIyBvdGhlciBtYWNyb3MgZnJvbSBkb2luZyB0aGUgc2FtZS4gIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRlZC4pICAtcG1lCiAgbmVlZF9saWJtYXRoPW5vCgogICMgQ2hlY2sgZm9yIHVDbGliYyBzaW5jZSBMaW51eCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uCiAgIyBkaXJlY3RvcmllcyBkZXBlbmRpbmcgb24gdGhlIEMgbGlicmFyeSBpbiB1c2UuCiAgQUNfRUdSRVBfQ1BQKFtfdXNpbmdfdWNsaWJjXSwgWwogICNpbmNsdWRlIDxzdGRpby5oPgogICNpZiBfX1VDTElCQ19fCiAgICBfdXNpbmdfdWNsaWJjCiAgI2VuZGlmCiAgXSwgdWNsaWJjPXllcywgdWNsaWJjPW5vKQoKICAjIEZpbmQgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3JpZXMgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGluZm8uCiAgIyBBbHNvIHBvc3NpYmx5IG1vZGlmeSBmbGFncyB1c2VkIGVsc2V3aGVyZSwgYXMgbmVlZGVkIGJ5IHRoZSBwbGF0Zm9ybS4KICBHTElCQ1hYX0NIRUNLX0hPU1QKXSkKCgpkbmwKZG5sIFRlc3RzIGZvciBuZXdlciBjb21waWxlciBmZWF0dXJlcywgb3IgZmVhdHVyZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBuZXdlcgpkbmwgY29tcGlsZXIgdmVyc2lvbnMgYnV0IG5vdCBvbGRlciBjb21waWxlciB2ZXJzaW9ucyBzdGlsbCBpbiB1c2UsIHNob3VsZApkbmwgYmUgcGxhY2VkIGhlcmUuCmRubApkbmwgRGVmaW5lczoKZG5sICBXRVJST1I9Jy1XZXJyb3InIGlmIHJlcXVlc3RlZCBhbmQgcG9zc2libGU7IGcrKydzIHRoYXQgbGFjayB0aGUKZG5sICAgbmV3IGlubGluaW5nIGNvZGUgb3IgdGhlIG5ldyBzeXN0ZW1faGVhZGVyIHByYWdtYSB3aWxsIGRpZSBvbiAtV2Vycm9yLgpkbmwgICBMZWF2ZSBpdCBvdXQgYnkgZGVmYXVsdCBhbmQgdXNlIG1haW50LW1vZGUgdG8gdXNlIGl0LgpkbmwgIFNFQ1RJT05fRkxBR1M9Jy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zJyBpZgpkbmwgICBjb21waWxlciBzdXBwb3J0cyBpdCBhbmQgdGhlIHVzZXIgaGFzIG5vdCByZXF1ZXN0ZWQgZGVidWcgbW9kZS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0NPTVBJTEVSX0ZFQVRVUkVTXSwgWwogICMgQWxsIHRoZXNlIHRlc3RzIGFyZSBmb3IgQysrOyBzYXZlIHRoZSBsYW5ndWFnZSBhbmQgdGhlIGNvbXBpbGVyIGZsYWdzLgogICMgVGhlIENYWEZMQUdTIHRoaW5nIGlzIHN1c3BpY2lvdXMsIGJ1dCBiYXNlZCBvbiBzaW1pbGFyIGJpdHMgcHJldmlvdXNseQogICMgZm91bmQgaW4gR0xJQkNYWF9DT05GSUdVUkUuCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgoKICAjIENoZWNrIGZvciBtYWludGFpbmVyLW1vZGUgYml0cy4KICBpZiB0ZXN0IHgiJFVTRV9NQUlOVEFJTkVSX01PREUiID0geG5vOyB0aGVuCiAgICBXRVJST1I9JycKICBlbHNlCiAgICBXRVJST1I9Jy1XZXJyb3InCiAgZmkKCiAgIyBDaGVjayBmb3IgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnKysgdGhhdCBzdXBwb3J0cyAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9uc10pCiAgQ1hYRkxBR1M9Jy1XZXJyb3IgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMnCiAgQUNfVFJZX0NPTVBJTEUoLCBbaW50IGZvbztdLCBbYWNfZmRzZWN0aW9ucz15ZXNdLCBbYWNfZmRzZWN0aW9ucz1ub10pCiAgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCiAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgZWxzZQogICAgIyB0aGlzIGlzIHRoZSBzdXNwaWNpb3VzIHBhcnQKICAgIENYWEZMQUdTPScnCiAgZmkKICBpZiB0ZXN0IHgiJGFjX2Zkc2VjdGlvbnMiID0geCJ5ZXMiOyB0aGVuCiAgICBTRUNUSU9OX0ZMQUdTPSctZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucycKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2Zkc2VjdGlvbnMpCgogIEFDX0xBTkdfUkVTVE9SRQogIEFDX1NVQlNUKFdFUlJPUikKICBBQ19TVUJTVChTRUNUSU9OX0ZMQUdTKQpdKQoKCmRubApkbmwgSWYgR05VIGxkIGlzIGluIHVzZSwgY2hlY2sgdG8gc2VlIGlmIHRyaWNreSBsaW5rZXIgb3B0cyBjYW4gYmUgdXNlZC4gIElmCmRubCB0aGUgbmF0aXZlIGxpbmtlciBpcyBpbiB1c2UsIGFsbCB2YXJpYWJsZXMgd2lsbCBiZSBkZWZpbmVkIHRvIHNvbWV0aGluZwpkbmwgc2FmZSAobGlrZSBhbiBlbXB0eSBzdHJpbmcpLgpkbmwKZG5sIERlZmluZXM6CmRubCAgU0VDVElPTl9MREZMQUdTPSctV2wsLS1nYy1zZWN0aW9ucycgaWYgcG9zc2libGUKZG5sICBPUFRfTERGTEFHUz0nLVdsLC1PMScgYW5kICcteixyZWxybycgaWYgcG9zc2libGUKZG5sICBMRCAoYXMgYSBzaWRlIGVmZmVjdCBvZiB0ZXN0aW5nKQpkbmwgU2V0czoKZG5sICB3aXRoX2dudV9sZApkbmwgIGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gKHBvc3NpYmx5KQpkbmwKZG5sIFRoZSBsYXN0IHdpbGwgYmUgYSBzaW5nbGUgaW50ZWdlciwgZS5nLiwgdmVyc2lvbiAxLjIzLjQ1LjAuNjcuODkgd2lsbApkbmwgc2V0IGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gdG8gMTIzNDUuICBaZXJvcyBjYXVzZSBwcm9ibGVtcy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFU10sIFsKICAjIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiBldmVuIHRyeWluZyB0aGVzZQogICMgdGVzdHMuICBDaGVjayBmb3IgdGhhdCBmaXJzdC4gIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgdGVzdGVkIGZvciBnbGQKICAjIGJ5IG5vdyAoaW4gbGlidG9vbCksIGJ1dCByZXF1aXJlIGl0IG5vdyBqdXN0IHRvIGJlIHNhZmUuLi4KICB0ZXN0IC16ICIkU0VDVElPTl9MREZMQUdTIiAmJiBTRUNUSU9OX0xERkxBR1M9JycKICB0ZXN0IC16ICIkT1BUX0xERkxBR1MiICYmIE9QVF9MREZMQUdTPScnCiAgQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pCiAgQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKQoKICAjIFRoZSBuYW1lIHNldCBieSBsaWJ0b29sIGRlcGVuZHMgb24gdGhlIHZlcnNpb24gb2YgbGlidG9vbC4gIFNoYW1lIG9uIHVzCiAgIyBmb3IgZGVwZW5kaW5nIG9uIGFuIGltcGwgZGV0YWlsLCBidXQgYydlc3QgbGEgdmllLiAgT2xkZXIgdmVyc2lvbnMgdXNlZAogICMgYWNfY3ZfcHJvZ19nbnVfbGQsIGJ1dCBub3cgaXQncyBsdF9jdl9wcm9nX2dudV9sZCwgYW5kIGlzIGNvcGllZCBiYWNrIG9uCiAgIyB0b3Agb2Ygd2l0aF9nbnVfbGQgKHdoaWNoIGlzIGFsc28gc2V0IGJ5IC0td2l0aC1nbnUtbGQsIHNvIHRoYXQgYWN0dWFsbHkKICAjIG1ha2VzIHNlbnNlKS4gIFdlJ2xsIHRlc3Qgd2l0aF9nbnVfbGQgZXZlcnl3aGVyZSBlbHNlLCBzbyBpZiB0aGF0IGlzbid0CiAgIyBzZXQgKGhlbmNlIHdlJ3JlIHVzaW5nIGFuIG9sZGVyIGxpYnRvb2wpLCB0aGVuIHNldCBpdC4KICBpZiB0ZXN0IHgke3dpdGhfZ251X2xkK3NldH0gIT0geHNldDsgdGhlbgogICAgaWYgdGVzdCB4JHthY19jdl9wcm9nX2dudV9sZCtzZXR9ICE9IHhzZXQ7IHRoZW4KICAgICAgIyBXZSBnb3QgdGhyb3VnaCAiYWNfcmVxdWlyZShhY19wcm9nX2xkKSIgYW5kIHN0aWxsIG5vdCBzZXQ/ICBIdWg/CiAgICAgIHdpdGhfZ251X2xkPW5vCiAgICBlbHNlCiAgICAgIHdpdGhfZ251X2xkPSRhY19jdl9wcm9nX2dudV9sZAogICAgZmkKICBmaQoKICAjIFN0YXJ0IGJ5IGdldHRpbmcgdGhlIHZlcnNpb24gbnVtYmVyLiAgSSB0aGluayB0aGUgbGlidG9vbCB0ZXN0IGFscmVhZHkKICAjIGRvZXMgc29tZSBvZiB0aGlzLCBidXQgdGhyb3dzIGF3YXkgdGhlIHJlc3VsdC4KICBpZiB0ZXN0IHgiJHdpdGhfZ251X2xkIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdmVyc2lvbl0pCiAgICBjaGFuZ2VxdW90ZSgsKQogICAgbGR2ZXI9YCRMRCAtLXZlcnNpb24gMj4vZGV2L251bGwgfCBoZWFkIC0xIHwgXAogICAgICAgICAgIHNlZCAtZSAncy9HTlUgbGQgXCh2ZXJzaW9uIFwpXHswLDFcfVwoKFteKV0qKSBcKVx7MCwxXH1cKFswLTkuXVswLTkuXSpcKS4qL1wzLydgCiAgICBjaGFuZ2VxdW90ZShbLF0pCiAgICBnbGliY3h4X2dudV9sZF92ZXJzaW9uPWBlY2hvICRsZHZlciB8IFwKICAgICAgICAgICAkQVdLIC1GLiAneyBpZiAoTkY8MykgWyRdMz0wOyBwcmludCAoWyRdMSoxMDArWyRdMikqMTAwK1skXTMgfSdgCiAgICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2dudV9sZF92ZXJzaW9uKQogIGZpCgogICMgU2V0IC0tZ2Mtc2VjdGlvbnMuCiAgZ2xpYmN4eF9nY3NlY3Rpb25zX21pbl9sZD0yMTYwMgogIGlmIHRlc3QgeCIkd2l0aF9nbnVfbGQiID0geCJ5ZXMiICYmIAoJdGVzdCAkZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbiAtZ3QgJGdsaWJjeHhfZ2NzZWN0aW9uc19taW5fbGQgOyB0aGVuCgogICAgIyBTdWZmaWNpZW50bHkgeW91bmcgR05VIGxkIGl0IGlzISAgSm95IGFuZCBidW5ueSByYWJiaXRzIQogICAgIyBOQjogVGhpcyBmbGFnIG9ubHkgd29ya3MgcmVsaWFibHkgYWZ0ZXIgMi4xNi4xLiBDb25maWd1cmUgdGVzdHMKICAgICMgZm9yIHRoaXMgYXJlIGRpZmZpY3VsdCwgc28gaGFyZCB3aXJlIGEgdmFsdWUgdGhhdCBzaG91bGQgd29yay4KCiAgICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogICAgQ0ZMQUdTPSctV2wsLS1nYy1zZWN0aW9ucycKCiAgICAjIENoZWNrIGZvciAtV2wsLS1nYy1zZWN0aW9ucwogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdGhhdCBzdXBwb3J0cyAtV2wsLS1nYy1zZWN0aW9uc10pCiAgICBBQ19UUllfTElOSyhbIGludCBvbmUodm9pZCkgeyByZXR1cm4gMTsgfQogICAgIGludCB0d28odm9pZCkgeyByZXR1cm4gMjsgfQoJXSwgWyB0d28oKTsgXSAsIFthY19nY3NlY3Rpb25zPXllc10sIFthY19nY3NlY3Rpb25zPW5vXSkKICAgIGlmIHRlc3QgIiRhY19nY3NlY3Rpb25zIiA9ICJ5ZXMiOyB0aGVuCiAgICAgIHJtIC1mIGNvbmZ0ZXN0LmMKICAgICAgdG91Y2ggY29uZnRlc3QuYwogICAgICBpZiAkQ0MgLWMgY29uZnRlc3QuYzsgdGhlbgoJaWYgJExEIC0tZ2Mtc2VjdGlvbnMgLW8gY29uZnRlc3QgY29uZnRlc3QubyAyPiYxIHwgXAoJICAgZ3JlcCAiV2FybmluZzogZ2Mtc2VjdGlvbnMgb3B0aW9uIGlnbm9yZWQiID4gL2Rldi9udWxsOyB0aGVuCgkgIGFjX2djc2VjdGlvbnM9bm8KCWZpCiAgICAgIGZpCiAgICAgIHJtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3QubyBjb25mdGVzdAogICAgZmkKICAgIGlmIHRlc3QgIiRhY19nY3NlY3Rpb25zIiA9ICJ5ZXMiOyB0aGVuCiAgICAgIFNFQ1RJT05fTERGTEFHUz0iLVdsLC0tZ2Mtc2VjdGlvbnMgJFNFQ1RJT05fTERGTEFHUyIKICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRhY19nY3NlY3Rpb25zKQoKICAgIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgICBlbHNlCiAgICAgICMgdGhpcyBpcyB0aGUgc3VzcGljaW91cyBwYXJ0CiAgICAgIENGTEFHUz0nJwogICAgZmkKICBmaQoKICAjIFNldCAteixyZWxyby4KICAjIE5vdGUgdGhpcyBpcyBvbmx5IGZvciBzaGFyZWQgb2JqZWN0cy4KICBhY19sZF9yZWxybz1ubwogIGlmIHRlc3QgeCIkd2l0aF9nbnVfbGQiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB0aGF0IHN1cHBvcnRzIC1XbCwteixyZWxyb10pCiAgICBjeHhfel9yZWxvPWAkTEQgLXYgLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAieiByZWxybyJgCiAgICBpZiB0ZXN0IC1uICIkY3h4X3pfcmVsbyI7IHRoZW4KICAgICAgT1BUX0xERkxBR1M9Ii1XbCwteixyZWxybyIKICAgICAgYWNfbGRfcmVscm89eWVzCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVCgkYWNfbGRfcmVscm8pCiAgZmkKCiAgIyBTZXQgbGlua2VyIG9wdGltaXphdGlvbiBmbGFncy4KICBpZiB0ZXN0IHgiJHdpdGhfZ251X2xkIiA9IHgieWVzIjsgdGhlbgogICAgT1BUX0xERkxBR1M9Ii1XbCwtTzEgJE9QVF9MREZMQUdTIgogIGZpCgogIEFDX1NVQlNUKFNFQ1RJT05fTERGTEFHUykKICBBQ19TVUJTVChPUFRfTERGTEFHUykKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiB0aGlzIHRhcmdldCBjYW4gZW5hYmxlIHRoZSBpY29udiBzcGVjaWFsaXphdGlvbnMuCmRubCBJZiAtLWRpc2FibGUtYy1tYmNoYXIgd2FzIGdpdmVuLCBubyB3Y2hhcl90IHNwZWNpYWxpemF0aW9uIGlzIGVuYWJsZWQuICAKZG5sIChUaGlzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2hlY2tlZCwgYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiBDOTkgCmRubCBzdXBwb3J0LikgQnkgZGVmYXVsdCwgaWNvbnYgc3VwcG9ydCBpcyBkaXNhYmxlZC4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX1VTRV9JQ09OViBpZiBhbGwgdGhlIGJpdHMgYXJlIGZvdW5kLgpkbmwgU3Vic3RzOgpkbmwgIExJQklDT05WIHRvIGEgLWwgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGljb252IGxpYnJhcnksIGlmIG5lZWRlZC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0lDT05WX1NVUFBPUlRdLCBbCgogIGVuYWJsZV9pY29udj1ubwogICMgT25seSBjb250aW51ZSBjaGVja2luZyBpZiB0aGUgSVNPIEM5OSBoZWFkZXJzIGV4aXN0IGFuZCBzdXBwb3J0IGlzIG9uLgogIGlmIHRlc3QgeCIkZW5hYmxlX3djaGFyX3QiID0geHllczsgdGhlbgoKICAgICMgVXNlIGljb252IGZvciB3Y2hhcl90IHRvIGNoYXIgY29udmVyc2lvbnMuIEFzIHN1Y2gsIGNoZWNrIGZvcgogICAgIyBYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUsIHZlcnNpb24gMiBmZWF0dXJlcyAoWFBHMikuCiAgICBBQ19DSEVDS19IRUFERVIoaWNvbnYuaCwgYWNfaGFzX2ljb252X2g9eWVzLCBhY19oYXNfaWNvbnZfaD1ubykKICAgIEFDX0NIRUNLX0hFQURFUihsYW5naW5mby5oLCBhY19oYXNfbGFuZ2luZm9faD15ZXMsIGFjX2hhc19sYW5naW5mb19oPW5vKQoKICAgICMgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBsaWJpY29udi5hIHByb3ZpZGluZyBYUEcyIHdjaGFyX3Qgc3VwcG9ydC4KICAgIEFDX0NIRUNLX0xJQihpY29udiwgaWNvbnYsIExJQklDT05WPSItbGljb252IikKICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgICBMSUJTPSIkTElCUyAkTElCSUNPTlYiCiAgICBBQ19TVUJTVChMSUJJQ09OVikKCiAgICBBQ19DSEVDS19GVU5DUyhbaWNvbnZfb3BlbiBpY29udl9jbG9zZSBpY29udiBubF9sYW5naW5mb10sCiAgICBbYWNfWFBHMmZ1bmNzPXllc10sIFthY19YUEcyZnVuY3M9bm9dKQoKICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCgogICAgaWYgdGVzdCB4IiRhY19oYXNfaWNvbnZfaCIgPSB4eWVzICYmCiAgICAgICB0ZXN0IHgiJGFjX2hhc19sYW5naW5mb19oIiA9IHh5ZXMgJiYKICAgICAgIHRlc3QgeCIkYWNfWFBHMmZ1bmNzIiA9IHh5ZXM7CiAgICB0aGVuCiAgICAgIEFDX0RFRklORShbX0dMSUJDWFhfVVNFX0lDT05WXSwxLAoJICAgICAgICBbRGVmaW5lIGlmIGljb252IGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBleGlzdCBhbmQgYXJlIHVzYWJsZS5dKQogICAgICBlbmFibGVfaWNvbnY9eWVzCiAgICBmaQogIGZpCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZW5hYmxlZCBpY29udiBzcGVjaWFsaXphdGlvbnNdKQogIEFDX01TR19SRVNVTFQoJGVuYWJsZV9pY29udikKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBoZWFkZXJzIGZvciwgYW5kIGFyZ3VtZW50cyB0bywgdGhlIHNldHJsaW1pdCgpIGZ1bmN0aW9uLgpkbmwgVXNlZCBvbmx5IGluIHRlc3RzdWl0ZV9ob29rcy5oLiAgQ2FsbGVkIGZyb20gR0xJQkNYWF9DT05GSUdVUkVfVEVTVFNVSVRFLgpkbmwKZG5sIERlZmluZXM6CmRubCAgX0dMSUJDWFhfUkVTX0xJTUlUUyBpZiB3ZSBjYW4gc2V0IGFydGlmaWNpYWwgcmVzb3VyY2UgbGltaXRzIApkbmwgIHZhcmlvdXMgSEFWRV9MSU1JVF8qIGZvciBpbmRpdmlkdWFsIGxpbWl0IG5hbWVzCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeV0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBSTElNSVRfJDFdKQogIEFDX1RSWV9DT01QSUxFKAogICAgWyNpbmNsdWRlIDx1bmlzdGQuaD4KICAgICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICAgICAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAgICBdLAogICAgWyBpbnQgZiA9IFJMSU1JVF8kMSA7IF0sCiAgICBbZ2xpYmN4eF9tcmVzdWx0PTFdLCBbZ2xpYmN4eF9tcmVzdWx0PTBdKQogIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX0xJTUlUXyQxLCAkZ2xpYmN4eF9tcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICBbT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC5dKQogIGlmIHRlc3QgJGdsaWJjeHhfbXJlc3VsdCA9IDEgOyB0aGVuIHJlcz15ZXMgOyBlbHNlIHJlcz1ubyA7IGZpCiAgQUNfTVNHX1JFU1VMVCgkcmVzKQpdKQoKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUXSwgWwogIHNldHJsaW1pdF9oYXZlX2hlYWRlcnM9eWVzCiAgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oLAogICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICBbc2V0cmxpbWl0X2hhdmVfaGVhZGVycz1ub10pCiAgIyBJZiBkb24ndCBoYXZlIHRoZSBoZWFkZXJzLCB0aGVuIHdlIGNhbid0IHJ1biB0aGUgdGVzdHMgbm93LCBhbmQgd2UKICAjIHdvbid0IGJlIHNlZWluZyBhbnkgb2YgdGhlc2UgZHVyaW5nIHRlc3RzdWl0ZSBjb21waWxhdGlvbi4KICBpZiB0ZXN0ICRzZXRybGltaXRfaGF2ZV9oZWFkZXJzID0geWVzOyB0aGVuCiAgICAjIENhbid0IGRvIHRoZXNlIGluIGEgbG9vcCwgZWxzZSB0aGUgcmVzdWx0aW5nIHN5bnRheCBpcyB3cm9uZy4KICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoREFUQSkKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoUlNTKQogICAgR0xJQkNYWF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeShWTUVNKQogICAgR0xJQkNYWF9DSEVDS19TRVRSTElNSVRfYW5jaWxsaWFyeShBUykKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoRlNJWkUpCgogICAgIyBDaGVjayBmb3IgcmxpbWl0LCBzZXRybGltaXQuCiAgICBBQ19DQUNIRV9WQUwoYWNfc2V0cmxpbWl0LCBbCiAgICAgIEFDX1RSWV9DT01QSUxFKAogICAgICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgICAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgogICAgICAgICAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAgICAgICAgXSwKICAgICAgICBbc3RydWN0IHJsaW1pdCByOwogICAgICAgICBzZXRybGltaXQoMCwgJnIpO10sCiAgICAgICAgW2FjX3NldHJsaW1pdD15ZXNdLCBbYWNfc2V0cmxpbWl0PW5vXSkKICAgIF0pCiAgZmkKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGVzdHN1aXRlIHJlc291cmNlIGxpbWl0cyBzdXBwb3J0XSkKICBpZiB0ZXN0ICRzZXRybGltaXRfaGF2ZV9oZWFkZXJzID0geWVzICYmIHRlc3QgJGFjX3NldHJsaW1pdCA9IHllczsgdGhlbgogICAgYWNfcmVzX2xpbWl0cz15ZXMKICAgIEFDX0RFRklORShfR0xJQkNYWF9SRVNfTElNSVRTLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgdXNpbmcgc2V0cmxpbWl0IHRvIHNldCByZXNvdXJjZSBsaW1pdHMgZHVyaW5nCiAgICAgICAgICAgICAgIm1ha2UgY2hlY2siXSkKICBlbHNlCiAgICBhY19yZXNfbGltaXRzPW5vCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19yZXNfbGltaXRzKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBTX0lTUkVHIChQb3NpeCkgb3IgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LgpkbmwgRGVmaW5lIEhBVkVfU19JU1JFRyAvIEhBVkVfU19JRlJFRyBhcHByb3ByaWF0ZWx5LgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU19JU1JFR19PUl9TX0lGUkVHXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIFNfSVNSRUcgb3IgU19JRlJFR10pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfU19JU1JFRywgWwogICAgQUNfVFJZX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8c3lzL3N0YXQuaD5dLAogICAgICBbc3RydWN0IHN0YXQgYnVmZmVyOwogICAgICAgZnN0YXQoMCwgJmJ1ZmZlcik7CiAgICAgICBTX0lTUkVHKGJ1ZmZlci5zdF9tb2RlKTtdLAogICAgICBbZ2xpYmN4eF9jdl9TX0lTUkVHPXllc10sCiAgICAgIFtnbGliY3h4X2N2X1NfSVNSRUc9bm9dKQogIF0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfU19JRlJFRywgWwogICAgQUNfVFJZX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8c3lzL3N0YXQuaD5dLAogICAgICBbc3RydWN0IHN0YXQgYnVmZmVyOwogICAgICAgZnN0YXQoMCwgJmJ1ZmZlcik7CiAgICAgICBTX0lGUkVHICYgYnVmZmVyLnN0X21vZGU7XSwKICAgICAgW2dsaWJjeHhfY3ZfU19JRlJFRz15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9TX0lGUkVHPW5vXSkKICBdKQogIHJlcz1ubwogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfU19JU1JFRyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfU19JU1JFRywgMSwgCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uXSkKICAgIHJlcz1TX0lTUkVHCiAgZWxpZiB0ZXN0ICRnbGliY3h4X2N2X1NfSUZSRUcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1NfSUZSRUcsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBTX0lGUkVHIGlzIGF2YWlsYWJsZSBpbiA8c3lzL3N0YXQuaD4uXSkKICAgIHJlcz1TX0lGUkVHCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRyZXMpCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIHBvbGwgaXMgYXZhaWxhYmxlIGluIDxwb2xsLmg+LCBhbmQgZGVmaW5lIEhBVkVfUE9MTC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1BPTExdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcG9sbF0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfUE9MTCwgWwogICAgQUNfVFJZX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8cG9sbC5oPl0sCiAgICAgIFtzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKICAgICAgIHBmZFswXS5ldmVudHMgPSBQT0xMSU47CiAgICAgICBwb2xsKHBmZCwgMSwgMCk7XSwKICAgICAgW2dsaWJjeHhfY3ZfUE9MTD15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9QT0xMPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfUE9MTCA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfUE9MTCwgMSwgW0RlZmluZSBpZiBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPi5dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9QT0xMKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciB3cml0ZXYgaXMgYXZhaWxhYmxlIGluIDxzeXMvdWlvLmg+LCBhbmQgZGVmaW5lIEhBVkVfV1JJVEVWLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfV1JJVEVWXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIHdyaXRldl0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfV1JJVEVWLCBbCiAgICBBQ19UUllfTElOSygKICAgICAgWyNpbmNsdWRlIDxzeXMvdWlvLmg+XSwKICAgICAgW3N0cnVjdCBpb3ZlYyBpb3ZbMl07CiAgICAgICB3cml0ZXYoMCwgaW92LCAwKTtdLAogICAgICBbZ2xpYmN4eF9jdl9XUklURVY9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfV1JJVEVWPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfV1JJVEVWID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9XUklURVYsIDEsIFtEZWZpbmUgaWYgd3JpdGV2IGlzIGF2YWlsYWJsZSBpbiA8c3lzL3Vpby5oPi5dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9XUklURVYpCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIGludDY0X3QgaXMgYXZhaWxhYmxlIGluIDxzdGRpbnQuaD4sIGFuZCBkZWZpbmUgSEFWRV9JTlQ2NF9ULgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSU5UNjRfVF0sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbnQ2NF90XSkKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9JTlQ2NF9ULCBbCiAgICBBQ19UUllfQ09NUElMRSgKICAgICAgWyNpbmNsdWRlIDxzdGRpbnQuaD5dLAogICAgICBbaW50NjRfdCB2YXI7XSwKICAgICAgW2dsaWJjeHhfY3ZfSU5UNjRfVD15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9JTlQ2NF9UPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfSU5UNjRfVCA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfSU5UNjRfVCwgMSwgW0RlZmluZSBpZiBpbnQ2NF90IGlzIGF2YWlsYWJsZSBpbiA8c3RkaW50Lmg+Ll0pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X0lOVDY0X1QpCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIExGUyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0xGU10sIFsKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIJCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgTEZTIHN1cHBvcnRdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X0xGUywgWwogICAgQUNfVFJZX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogICAgICBdLAogICAgICBbRklMRSogZnA7CiAgICAgICBmb3BlbjY0KCJ0IiwgInciKTsKICAgICAgIGZzZWVrbzY0KGZwLCAwLCBTRUVLX0NVUik7CiAgICAgICBmdGVsbG82NChmcCk7CiAgICAgICBsc2VlazY0KDEsIDAsIFNFRUtfQ1VSKTsKICAgICAgIHN0cnVjdCBzdGF0NjQgYnVmOwogICAgICAgZnN0YXQ2NCgxLCAmYnVmKTtdLAogICAgICBbZ2xpYmN4eF9jdl9MRlM9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfTEZTPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfTEZTID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0xGUywgMSwgW0RlZmluZSBpZiBMRlMgc3VwcG9ydCBpcyBhdmFpbGFibGUuXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfTEZTKQogIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGV0aGVyIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24gc2hvdWxkCmRubCBiZSB0dXJuZWQgb24sIHRoYXQgZG9lcyBub3QgcHV0IGVtcHR5IG9iamVjdHMgaW4gcGVyLXByb2Nlc3Mgc3RhdGljCmRubCBtZW1vcnkgKG1vc3RseSB1c2VmdWwgdG9nZXRoZXIgd2l0aCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRvcnMsIHNlZSBQUgpkbmwgbGlic3RkYysrLzE2NjEyIGZvciBkZXRhaWxzKS4KZG5sCmRubCAtLWVuYWJsZS1mdWxseS1keW5hbWljLXN0cmluZyBkZWZpbmVzIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCmRubCAtLWRpc2FibGUtZnVsbHktZHluYW1pYy1zdHJpbmcgbGVhdmVzIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HIHVuZGVmaW5lZApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfRlVMTFlfRFlOQU1JQ19TVFJJTkdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9GVUxMWV9EWU5BTUlDX1NUUklOR10sIFsKICBHTElCQ1hYX0VOQUJMRShmdWxseS1keW5hbWljLXN0cmluZywkMSwsW2RvIG5vdCBwdXQgZW1wdHkgc3RyaW5ncyBpbiBwZXItcHJvY2VzcyBzdGF0aWMgbWVtb3J5XSkKICBpZiB0ZXN0ICRlbmFibGVfZnVsbHlfZHluYW1pY19zdHJpbmcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORywgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaXMgd2FudGVkLl0pCiAgZmkKXSkKCgpkbmwKZG5sIERvZXMgYW55IG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uIG9mIHRoZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LiAgR2VuZXJhdGVzCmRubCB0aGUgdGVzdHN1aXRlX2hvb2tzLmggaGVhZGVyLgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFX1NZTVZFUlMgYW5kIEdMSUJDWFhfSVNfTkFUSVZFIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhpcy4KZG5sCmRubCBTZXRzOgpkbmwgIGVuYWJsZV9hYmlfY2hlY2sgCmRubCAgR0xJQkNYWF9URVNUX1dDSEFSX1QKZG5sICBHTElCQ1hYX1RFU1RfVEhSRUFECmRubCBTdWJzdHM6CmRubCAgYmFzZWxpbmVfZGlyCmRubApBQ19ERUZVTihbR0xJQkNYWF9DT05GSUdVUkVfVEVTVFNVSVRFXSwgWwogIGlmICRHTElCQ1hYX0lTX05BVElWRSA7IHRoZW4KICAgICMgRG8gY2hlY2tzIGZvciByZXNvdXJjZSBsaW1pdCBmdW5jdGlvbnMuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVAoKICAgICMgTG9vayBmb3Igc2V0ZW52LCBzbyB0aGF0IGV4dGVuZGVkIGxvY2FsZSB0ZXN0cyBjYW4gYmUgcGVyZm9ybWVkLgogICAgR0xJQkNYWF9DSEVDS19TVERMSUJfREVDTF9BTkRfTElOS0FHRV8zKHNldGVudikKICBmaQoKICBpZiAkR0xJQkNYWF9JU19OQVRJVkUgJiYgdGVzdCAkaXNfaG9zdGVkID0geWVzICYmCiAgICAgdGVzdCAkZW5hYmxlX3N5bXZlcnMgIT0gbm87IHRoZW4KICAgIGNhc2UgIiRob3N0IiBpbgogICAgICAqLSotY3lnd2luKikKICAgICAgICBlbmFibGVfYWJpX2NoZWNrPW5vIDs7CiAgICAgICopCiAgICAgICAgZW5hYmxlX2FiaV9jaGVjaz15ZXMgOzsKICAgIGVzYWMKICBlbHNlCiAgICAjIE9ubHkgYnVpbGQgdGhpcyBhcyBuYXRpdmUsIHNpbmNlIGF1dG9tYWtlIGRvZXMgbm90IHVuZGVyc3RhbmQKICAgICMgQ1hYX0ZPUl9CVUlMRC4KICAgIGVuYWJsZV9hYmlfY2hlY2s9bm8KICBmaQogIAogICMgRXhwb3J0IGZpbGUgbmFtZXMgZm9yIEFCSSBjaGVja2luZy4KICBiYXNlbGluZV9kaXI9IiRnbGliY3h4X3NyY2Rpci9jb25maWcvYWJpL3Bvc3QvJHthYmlfYmFzZWxpbmVfcGFpcn1cJChNVUxUSVNVQkRJUikiCiAgQUNfU1VCU1QoYmFzZWxpbmVfZGlyKQpdKQoKCmRubApkbmwgU2V0IHVwICpfSU5DTFVERVMgdmFyaWFibGVzIGZvciBhbGwgc3VuZHJ5IE1ha2VmaWxlLmFtJ3MuCmRubApkbmwgU3Vic3RzOgpkbmwgIEdMSUJDWFhfSU5DTFVERVMKZG5sICBUT1BMRVZFTF9JTkNMVURFUwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRVhQT1JUX0lOQ0xVREVTXSwgWwogICMgVXNlZCBmb3IgZXZlcnkgQysrIGNvbXBpbGUgd2UgcGVyZm9ybS4KICBHTElCQ1hYX0lOQ0xVREVTPSJcCi1JJGdsaWJjeHhfYnVpbGRkaXIvaW5jbHVkZS8kaG9zdF9hbGlhcyBcCi1JJGdsaWJjeHhfYnVpbGRkaXIvaW5jbHVkZSBcCi1JJGdsaWJjeHhfc3JjZGlyL2xpYnN1cGMrKyIKCiAgIyBGb3IgQ2FuYWRpYW4gY3Jvc3NlcywgcGljayB0aGlzIHVwIHRvby4KICBpZiB0ZXN0ICRDQU5BRElBTiA9IHllczsgdGhlbgogICAgR0xJQkNYWF9JTkNMVURFUz0iJEdMSUJDWFhfSU5DTFVERVMgLUlcJHtpbmNsdWRlZGlyfSIKICBmaQoKICAjIFN0dWZmIGluIHRoZSBhY3R1YWwgdG9wIGxldmVsLiAgQ3VycmVudGx5IG9ubHkgdXNlZCBieSBsaWJzdXBjKysgdG8KICAjIGdldCB1bndpbmQqIGhlYWRlcnMgZnJvbSB0aGUgZ2NjIGRpci4KICAjVE9QTEVWRUxfSU5DTFVERVM9Jy1JJCh0b3BsZXZlbF9zcmNkaXIpL2djYyAtSSQodG9wbGV2ZWxfc3JjZGlyKS9pbmNsdWRlJwogIFRPUExFVkVMX0lOQ0xVREVTPSctSSQodG9wbGV2ZWxfc3JjZGlyKS9nY2MnCgogICMgTm93LCBleHBvcnQgdGhpcyB0byBhbGwgdGhlIGxpdHRsZSBNYWtlZmlsZXMuLi4uCiAgQUNfU1VCU1QoR0xJQkNYWF9JTkNMVURFUykKICBBQ19TVUJTVChUT1BMRVZFTF9JTkNMVURFUykKXSkKCgpkbmwKZG5sIFNldCB1cCAqX0ZMQUdTIGFuZCAqRkxBR1MgdmFyaWFibGVzIGZvciBhbGwgc3VuZHJ5IE1ha2VmaWxlLmFtJ3MuCmRubCAoU0VDVElPTl9GTEFHUyBpcyBkb25lIHVuZGVyIENIRUNLX0NPTVBJTEVSX0ZFQVRVUkVTLikKZG5sCmRubCBTdWJzdHM6CmRubCAgT1BUSU1JWkVfQ1hYRkxBR1MKZG5sICBXQVJOX0ZMQUdTCmRubApBQ19ERUZVTihbR0xJQkNYWF9FWFBPUlRfRkxBR1NdLCBbCiAgIyBPcHRpbWl6YXRpb24gZmxhZ3MgdGhhdCBhcmUgcHJvYmFibHkgYSBnb29kIGlkZWEgZm9yIHRocmlsbC1zZWVrZXJzLiBKdXN0CiAgIyB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93IGFuZCBtYWtlLCBldmVyeXRoaW5nIGVsc2UgaXMgcmVhZHkgdG8gZ28uLi4KICAjIE9QVElNSVpFX0NYWEZMQUdTID0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mdnRhYmxlLWdjCiAgT1BUSU1JWkVfQ1hYRkxBR1M9CiAgQUNfU1VCU1QoT1BUSU1JWkVfQ1hYRkxBR1MpCgogIFdBUk5fRkxBR1M9Jy1XYWxsIC1XZXh0cmEgLVd3cml0ZS1zdHJpbmdzIC1XY2FzdC1xdWFsJwogIEFDX1NVQlNUKFdBUk5fRkxBR1MpCl0pCgoKZG5sCmRubCBBbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpcyBkZXRlcm1pbmVkIGhlcmUuCmRubApkbmwgU3Vic3RzOgpkbmwgIGd4eF9pbnN0YWxsX2RpcgpkbmwgIGdsaWJjeHhfcHJlZml4ZGlyCmRubCAgZ2xpYmN4eF90b29sZXhlY2RpcgpkbmwgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIKZG5sCmRubCBBc3N1bWVzIGNyb3NzX2NvbXBpbGluZyBiaXRzIGFscmVhZHkgZG9uZSwgYW5kIHdpdGhfY3Jvc3NfaG9zdCBpbgpkbmwgcGFydGljdWxhci4KZG5sCmRubCBUaGlzIGxvZ2ljIG11c3QgbWF0Y2ggZ2NjL2NvbmZpZ3VyZS5hYydzIHNldHRpbmcgb2YgZ2NjX2d4eF9pbmNsdWRlX2Rpci4KZG5sIGNvbmZpZy9neHgtaW5jbHVkZS1kaXIubTQgbXVzdCBiZSBrZXB0IGNvbnNpc3RhbnQgd2l0aCB0aGlzIGFzIHdlbGwuCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9JTlNUQUxMX0lORk9dLCBbCiAgZ2xpYmN4eF90b29sZXhlY2Rpcj1ubwogIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9bm8KICBnbGliY3h4X3ByZWZpeGRpcj0kcHJlZml4CgogIEFDX01TR19DSEVDS0lORyhbZm9yIGd4eC1pbmNsdWRlLWRpcl0pCiAgQUNfQVJHX1dJVEgoW2d4eC1pbmNsdWRlLWRpcl0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWd4eC1pbmNsdWRlLWRpcj1ESVJdLAogICAgICAgICAgICAgICAgICAgW2luc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXNdKSwKICAgIFtjYXNlICIkd2l0aHZhbCIgaW4KICAgICAgeWVzKSBBQ19NU0dfRVJST1IoW01pc3NpbmcgZGlyZWN0b3J5IGZvciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyXSkgOzsKICAgICAgbm8pICBneHhfaW5jbHVkZV9kaXI9bm8gOzsKICAgICAgKikgICBneHhfaW5jbHVkZV9kaXI9JHdpdGh2YWwgOzsKICAgICBlc2FjXSwKICAgIFtneHhfaW5jbHVkZV9kaXI9bm9dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnNdKQogIEFDX0FSR19FTkFCTEUoW3ZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlic10sCiAgICAgICAgICAgICAgICAgICBbU3BlY2lmeSB0aGF0IHJ1bnRpbWUgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gYSBjb21waWxlci1zcGVjaWZpYyBkaXJlY3RvcnldKSwKICAgIFtjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICB5ZXMpIHZlcnNpb25fc3BlY2lmaWNfbGlicz15ZXMgOzsKICAgICAgbm8pICB2ZXJzaW9uX3NwZWNpZmljX2xpYnM9bm8gOzsKICAgICAgKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgdmVyc2lvbi1zcGVjaWZpYyBsaWJzXSk7OwogICAgIGVzYWNdLAogICAgW3ZlcnNpb25fc3BlY2lmaWNfbGlicz1ub10pCiAgQUNfTVNHX1JFU1VMVCgkdmVyc2lvbl9zcGVjaWZpY19saWJzKQoKICAjIERlZmF1bHQgY2FzZSBmb3IgaW5zdGFsbCBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXMuCiAgaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0gbm8gJiYgdGVzdCAkZ3h4X2luY2x1ZGVfZGlyID0gbm87IHRoZW4KICAgIGd4eF9pbmNsdWRlX2Rpcj0naW5jbHVkZS9jKysvJHtnY2NfdmVyc2lvbn0nCiAgICBpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJiAKICAgICAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgkKICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vJHt0YXJnZXRfYWxpYXN9LyciJGd4eF9pbmNsdWRlX2RpciIKICAgIGVsc2UKICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vJyIkZ3h4X2luY2x1ZGVfZGlyIgogICAgZmkKICBmaQoKICAjIFZlcnNpb24tc3BlY2lmaWMgcnVudGltZSBsaWJzIHByb2Nlc3NpbmcuCiAgaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0geWVzOyB0aGVuCiAgICAjIE5lZWQgdGhlIGdjYyBjb21waWxlciB2ZXJzaW9uIHRvIGtub3cgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJpZXMKICAgICMgYW5kIGhlYWRlciBmaWxlcyBpZiAtLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlicyBvcHRpb24KICAgICMgaXMgc2VsZWN0ZWQuICBGSVhNRTogdGhlc2UgdmFyaWFibGVzIGFyZSBtaXNuYW1lZCwgdGhlcmUgYXJlCiAgICAjIG5vIGV4ZWN1dGFibGVzIGluc3RhbGxlZCBpbiBfdG9vbGV4ZWNkaXIgb3IgX3Rvb2xleGVjbGliZGlyLgogICAgaWYgdGVzdCB4IiRneHhfaW5jbHVkZV9kaXIiID0geCJubyI7IHRoZW4KICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke2xpYmRpcn0vZ2NjLyR7aG9zdF9hbGlhc30vJHtnY2NfdmVyc2lvbn0vaW5jbHVkZS9jKysnCiAgICBmaQogICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtsaWJkaXJ9L2djYy8ke2hvc3RfYWxpYXN9JwogICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vJHtnY2NfdmVyc2lvbn0kKE1VTFRJU1VCRElSKScKICBmaQoKICAjIENhbGN1bGF0ZSBnbGliY3h4X3Rvb2xleGVjZGlyLCBnbGliY3h4X3Rvb2xleGVjbGliZGlyCiAgIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gdG9vbGRpciwgbm90IGxpYmRpci4KICBpZiB0ZXN0IHgiJGdsaWJjeHhfdG9vbGV4ZWNkaXIiID0geCJubyI7IHRoZW4KICAgIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCiAgICAgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4KICAgICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vJHtob3N0X2FsaWFzfScKICAgICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vbGliJwogICAgZWxzZQogICAgICBnbGliY3h4X3Rvb2xleGVjZGlyPScke2xpYmRpcn0vZ2NjLyR7aG9zdF9hbGlhc30nCiAgICAgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JyR7bGliZGlyfScKICAgIGZpCiAgICBtdWx0aV9vc19kaXJlY3Rvcnk9YCRDWFggLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKICAgIGNhc2UgJG11bHRpX29zX2RpcmVjdG9yeSBpbgogICAgICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCiAgICAgICopIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIvJG11bHRpX29zX2RpcmVjdG9yeSA7OwogICAgZXNhYwogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGluc3RhbGwgbG9jYXRpb25dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfU1VCU1QoZ2xpYmN4eF9wcmVmaXhkaXIpCiAgQUNfU1VCU1QoZ3h4X2luY2x1ZGVfZGlyKQogIEFDX1NVQlNUKGdsaWJjeHhfdG9vbGV4ZWNkaXIpCiAgQUNfU1VCU1QoZ2xpYmN4eF90b29sZXhlY2xpYmRpcikKXSkKCgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFCmRubCAgICAoRkVBVFVSRSwgREVGQVVMVCwgSEVMUC1BUkcsIEhFTFAtU1RSSU5HKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgcGVybWl0IGF8YnxjKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgU0hFTEwtQ09ERS1IQU5ETEVSKQpkbmwKZG5sIFNlZSBkb2NzL2h0bWwvMTdfaW50cm8vY29uZmlndXJ5Lmh0bWwjZW5hYmxlIGZvciBkb2N1bWVudGF0aW9uLgpkbmwKbTRfZGVmaW5lKFtHTElCQ1hYX0VOQUJMRV0sW2RubAptNF9kZWZpbmUoW19nX3N3aXRjaF0sWy0tZW5hYmxlLSQxXSlkbmwKbTRfZGVmaW5lKFtfZ19oZWxwXSxbQUNfSEVMUF9TVFJJTkcoX2dfc3dpdGNoJDMsWyQ0IEA8OkBkZWZhdWx0PSQyQDo+QF0pXSlkbmwKIEFDX0FSR19FTkFCTEUoJDEsX2dfaGVscCwKICBtNF9ibWF0Y2goWyQ1XSwKICAgW15wZXJtaXQgXSwKICAgICBbWwogICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICAgbTRfYnBhdHN1YnN0KFskNV0sW3Blcm1pdCBdKSkgOzsKICAgICAgICopIEFDX01TR19FUlJPUihVbmtub3duIGFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlICQxKSA7OwogICAgICAgICAgZG5sIElkZWEgZm9yIGZ1dHVyZTogIGdlbmVyYXRlIGEgVVJMIHBvaW50aW5nIHRvCiAgICAgICAgICBkbmwgIm9ubGluZWRvY3MvY29uZmlnb3B0cy5odG1sI3doYXRldmVyIgogICAgICBlc2FjCiAgICAgXV0sCiAgIFteJF0sCiAgICAgW1sKICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgICAgIHllc3xubykgOzsKICAgICAgICopIEFDX01TR19FUlJPUihBcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSAkMSBtdXN0IGJlIHllcyBvciBubykgOzsKICAgICAgZXNhYwogICAgIF1dLAogICBbWyQ1XV0pLAogIFtlbmFibGVfXW00X2JwYXRzdWJzdChbJDFdLC0sXylbPV1bJDJdKQptNF91bmRlZmluZShbX2dfc3dpdGNoXSlkbmwKbTRfdW5kZWZpbmUoW19nX2hlbHBdKWRubApdKQoKCmRubApkbmwgQ2hlY2sgZm9yIElTTy9JRUMgOTg5OToxOTk5ICJDOTkiIHN1cHBvcnQuCmRubApkbmwgLS1lbmFibGUtYzk5IGRlZmluZXMgX0dMSUJDWFhfVVNFX0M5OQpkbmwgLS1kaXNhYmxlLWM5OSBsZWF2ZXMgX0dMSUJDWFhfVVNFX0M5OSB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0M5OVsoREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwgICsgIElmICdDOTknIHN0dWZmIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yZXMgREVGQVVMVCBhbmQgc2V0cyBgbm8nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0M5OV0sIFsKICBHTElCQ1hYX0VOQUJMRShjOTksJDEsLFt0dXJucyBvbiBJU08vSUVDIDk4OTk6MTk5OSBzdXBwb3J0XSkKCiAgaWYgdGVzdCB4IiRlbmFibGVfYzk5IiA9IHgieWVzIjsgdGhlbgoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxtYXRoLmg+IGZ1bmN0aW9ucyB1c2VkIGlmIEM5OSBpcyBlbmFibGVkLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8bWF0aC5oPl0pCiAgQUNfQ0FDSEVfVkFMKGFjX2M5OV9tYXRoLCBbCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxtYXRoLmg+XSwKCSAgICAgICAgIFtmcGNsYXNzaWZ5KDAuMCk7CgkgICAgICAgICAgaXNmaW5pdGUoMC4wKTsgCgkJICBpc2luZigwLjApOwoJICAgICAgICAgIGlzbmFuKDAuMCk7CgkJICBpc25vcm1hbCgwLjApOwoJICAJICBzaWduYml0KDAuMCk7CgkgCSAgaXNncmVhdGVyKDAuMCwwLjApOwoJCSAgaXNncmVhdGVyZXF1YWwoMC4wLDAuMCk7CgkJICBpc2xlc3MoMC4wLDAuMCk7CgkJICBpc2xlc3NlcXVhbCgwLjAsMC4wKTsKCQkgIGlzbGVzc2dyZWF0ZXIoMC4wLDAuMCk7CgkJICBpc2xlc3NncmVhdGVyKDAuMCwwLjApOwoJCSAgaXN1bm9yZGVyZWQoMC4wLDAuMCk7CgkJIF0sW2FjX2M5OV9tYXRoPXllc10sIFthY19jOTlfbWF0aD1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfbWF0aCkKICBpZiB0ZXN0IHgiJGFjX2M5OV9tYXRoIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZAogICAgICAgICAgICAgIGluIDxjbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGNvbXBsZXguaD4gY29tcGxleCBtYXRoIGZ1bmN0aW9ucy4KICAjIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gdGhvdWdoIGxpYnN0ZGMrKyB1c2VzIHRoZSBidWlsdGluIHZlcnNpb25zCiAgIyBvZiB0aGVzZSBmdW5jdGlvbnMsIGJlY2F1c2UgaWYgdGhlIGJ1aWx0aW4gY2Fubm90IGJlIHVzZWQsIGEgcmVmZXJlbmNlCiAgIyB0byB0aGUgbGlicmFyeSBmdW5jdGlvbiBpcyBlbWl0dGVkLgogIEFDX0NIRUNLX0hFQURFUlMoY29tcGxleC5oLCBhY19oYXNfY29tcGxleF9oPXllcywgYWNfaGFzX2NvbXBsZXhfaD1ubykKICBhY19jOTlfY29tcGxleD1ubzsKICBpZiB0ZXN0IHgiJGFjX2hhc19jb21wbGV4X2giID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPGNvbXBsZXguaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjb21wbGV4Lmg+XSwKCSAgICAgICAgICAgW3R5cGVkZWYgX19jb21wbGV4X18gZmxvYXQgZmxvYXRfdHlwZTsgZmxvYXRfdHlwZSB0bXBmOwoJICAgICAgICAgICAgY2Fic2YodG1wZik7CgkJICAgIGNhcmdmKHRtcGYpOwoJCSAgICBjY29zZih0bXBmKTsKICAJCSAgICBjY29zaGYodG1wZik7CgkJICAgIGNleHBmKHRtcGYpOwoJICAgICAgICAgICAgY2xvZ2YodG1wZik7CgkJICAgIGNzaW5mKHRtcGYpOwoJCSAgICBjc2luaGYodG1wZik7CgkJICAgIGNzcXJ0Zih0bXBmKTsKCQkgICAgY3RhbmYodG1wZik7CgkJICAgIGN0YW5oZih0bXBmKTsKCQkgICAgY3Bvd2YodG1wZiwgdG1wZik7CgkJICAgIHR5cGVkZWYgX19jb21wbGV4X18gZG91YmxlIGRvdWJsZV90eXBlOyBkb3VibGVfdHlwZSB0bXBkOwoJICAgICAgICAgICAgY2Ficyh0bXBkKTsKCQkgICAgY2FyZyh0bXBkKTsKCQkgICAgY2Nvcyh0bXBkKTsKICAJCSAgICBjY29zaCh0bXBkKTsKCQkgICAgY2V4cCh0bXBkKTsKCSAgICAgICAgICAgIGNsb2codG1wZCk7CgkJICAgIGNzaW4odG1wZCk7CgkJICAgIGNzaW5oKHRtcGQpOwoJCSAgICBjc3FydCh0bXBkKTsKCQkgICAgY3Rhbih0bXBkKTsKCQkgICAgY3RhbmgodG1wZCk7CgkJICAgIGNwb3codG1wZCwgdG1wZCk7CgkJICAgIHR5cGVkZWYgX19jb21wbGV4X18gbG9uZyBkb3VibGUgbGRfdHlwZTsgbGRfdHlwZSB0bXBsZDsKCSAgICAgICAgICAgIGNhYnNsKHRtcGxkKTsKCQkgICAgY2FyZ2wodG1wbGQpOwoJCSAgICBjY29zbCh0bXBsZCk7CiAgCQkgICAgY2Nvc2hsKHRtcGxkKTsKCQkgICAgY2V4cGwodG1wbGQpOwoJICAgICAgICAgICAgY2xvZ2wodG1wbGQpOwoJCSAgICBjc2lubCh0bXBsZCk7CgkJICAgIGNzaW5obCh0bXBsZCk7CgkJICAgIGNzcXJ0bCh0bXBsZCk7CgkJICAgIGN0YW5sKHRtcGxkKTsKCQkgICAgY3RhbmhsKHRtcGxkKTsKCQkgICAgY3Bvd2wodG1wbGQsIHRtcGxkKTsKCQkgICBdLFthY19jOTlfY29tcGxleD15ZXNdLCBbYWNfYzk5X2NvbXBsZXg9bm9dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2NvbXBsZXgpCiAgaWYgdGVzdCB4IiRhY19jOTlfY29tcGxleCIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluCiAgICAgICAgICAgICAgPGNvbXBsZXg+LiBVc2luZyBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzCiAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBDOTkgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHN0ZGlvLmg+IG9mIHZzY2FuZiwgZXQuIGFsLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8c3RkaW8uaD5dKQogIEFDX0NBQ0hFX1ZBTChhY19jOTlfc3RkaW8sIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGlvLmg+CgkJICAjaW5jbHVkZSA8c3RkYXJnLmg+CiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIqIGZtdCwgLi4uKQogICAgICAgICAgICAgICAgICB7CgkgICAgICAgICAgICB2YV9saXN0IGFyZ3M7IHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAgICAgICAgICAgICAgICAgICAgdmZzY2FuZihzdGRlcnIsICIlaSIsIGFyZ3MpOyAKCQkgICAgdnNjYW5mKCIlaSIsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIHZzbnByaW50ZihmbXQsIDAsICIlaSIsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIHZzc2NhbmYoZm10LCAiJWkiLCBhcmdzKTsKCQkgIH1dLAogICAgICAgICAgICAgICAgIFtzbnByaW50ZigiMTIiLCAwLCAiJWkiKTtdLAoJCSBbYWNfYzk5X3N0ZGlvPXllc10sIFthY19jOTlfc3RkaW89bm9dKQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X3N0ZGlvKQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIGluIDxzdGRsaWIuaD4gb2YgbGxkaXZfdCwgZXQuIGFsLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8c3RkbGliLmg+XSkKICBBQ19DQUNIRV9WQUwoYWNfYzk5X3N0ZGxpYiwgWwogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkbGliLmg+XSwKICAgICAgICAgICAgICAgICBbY2hhciogdG1wOwoJICAgIAkgIHN0cnRvZigiZ251IiwgJnRtcCk7CgkJICBzdHJ0b2xkKCJnbnUiLCAmdG1wKTsKCSAgICAgICAgICBzdHJ0b2xsKCJnbnUiLCAmdG1wLCAxMCk7CgkgICAgICAgICAgc3RydG91bGwoImdudSIsICZ0bXAsIDEwKTsKCSAgICAgICAgICBsbGFicygxMCk7CgkJICBsbGRpdigxMCwxKTsKCQkgIGF0b2xsKCIxMCIpOwoJCSAgX0V4aXQoMCk7CgkJICBsbGRpdl90IG15ZGl2dDtdLFthY19jOTlfc3RkbGliPXllc10sIFthY19jOTlfc3RkbGliPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRsaWIpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHdjaGFyLmg+IG9mIHdjc3RvbGQsIGV0Yy4KICBhY19jOTlfd2NoYXI9bm87CiAgaWYgdGVzdCB4IiRhY19oYXNfd2NoYXJfaCIgPSB4eWVzICYmCiAgICAgdGVzdCB4IiRhY19oYXNfd2N0eXBlX2giID0geHllczsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IGluIDx3Y2hhci5oPl0pCQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0CiAgICAgICAgICAgICAgICAgICAgewoJCSAgICAgIHVzaW5nIDo6d2NzdG9sZDsKCQkgICAgICB1c2luZyA6Ondjc3RvbGw7CgkJICAgICAgdXNpbmcgOjp3Y3N0b3VsbDsKCQkgICAgfQoJCSAgIF0sW10sW2FjX2M5OV93Y2hhcj15ZXNdLCBbYWNfYzk5X3djaGFyPW5vXSkKCiAgICAjIENoZWNrcyBmb3Igd2lkZSBjaGFyYWN0ZXIgZnVuY3Rpb25zIHRoYXQgbWF5IG5vdCBiZSBwcmVzZW50LgogICAgIyBJbmplY3Rpb24gb2YgdGhlc2UgaXMgd3JhcHBlZCB3aXRoIGd1YXJkIG1hY3Jvcy4KICAgICMgTkI6IG9ubHkgcHV0IGZ1bmN0aW9ucyBoZXJlLCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGFib3ZlLCBpZgogICAgIyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD4KICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgdGVzdCB7IHVzaW5nIDo6dmZ3c2NhbmY7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfVkZXU0NBTkYsMSwKCQkJW0RlZmluZWQgaWYgdmZ3c2NhbmYgZXhpc3RzLl0pXSxbXSkKCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHRlc3QgeyB1c2luZyA6OnZzd3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZTV1NDQU5GLDEsCgkJCVtEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp2d3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZXU0NBTkYsMSxbRGVmaW5lZCBpZiB2d3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp3Y3N0b2Y7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfV0NTVE9GLDEsW0RlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y3R5cGUuaD5dLAogICAgICAgICAgICAgICAgICAgWyB3aW50X3QgdDsgaW50IGkgPSBpc3dibGFuayh0KTtdLCAKIAkgICAgCSAgIFtBQ19ERUZJTkUoSEFWRV9JU1dCTEFOSywxLAoJCQlbRGVmaW5lZCBpZiBpc3dibGFuayBleGlzdHMuXSldLFtdKQoKICAgIEFDX01TR19SRVNVTFQoJGFjX2M5OV93Y2hhcikKICBmaQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkuCiAgaWYgdGVzdCB4IiRhY19jOTlfbWF0aCIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X2NvbXBsZXgiID0geCJubyIgfHwKICAgICB0ZXN0IHgiJGFjX2M5OV9zdGRpbyIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3N0ZGxpYiIgPSB4Im5vIiB8fAogICAgIHRlc3QgeCIkYWNfYzk5X3djaGFyIiA9IHgibm8iOyB0aGVuCiAgICBlbmFibGVfYzk5PW5vOwogIGVsc2UKICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5LCAxLAogICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBmcm9tIDx3Y2hhci5oPiwgPG1hdGguaD4sCiAgICA8Y29tcGxleC5oPiwgPHN0ZGlvLmg+LCBhbmQgPHN0ZGxpYi5oPiBjYW4gYmUgdXNlZCBvciBleHBvc2VkLl0pCiAgZmkKCiAgQUNfTEFOR19SRVNUT1JFCiAgZmkJCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGZ1bGx5IGVuYWJsZWQgSVNPIEM5OSBzdXBwb3J0XSkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfYzk5KQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIElTTy9JRUMgOTg5OToxOTk5ICJDOTkiIHN1cHBvcnQgdG8gSVNPL0lFQyBEVFIgMTk3NjggIlRSMSIKZG5sIGZhY2lsaXRpZXMgaW4gQ2hhcHRlciA4LCAiQyBjb21wYXRpYmlsaXR5Ii4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0M5OV9UUjFdLCBbCgogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGNvbXBsZXguaD4gY29tcGxleCBtYXRoIGZ1bmN0aW9ucyB1c2VkCiAgIyBieSB0cjEvY29tcGxleC4KICBBQ19DSEVDS19IRUFERVJTKGNvbXBsZXguaCwgYWNfaGFzX2NvbXBsZXhfaD15ZXMsIGFjX2hhc19jb21wbGV4X2g9bm8pCiAgYWNfYzk5X2NvbXBsZXhfdHIxPW5vOwogIGlmIHRlc3QgeCIkYWNfaGFzX2NvbXBsZXhfaCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGNvbXBsZXguaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjb21wbGV4Lmg+XSwKCSAgICAgICAgICAgW3R5cGVkZWYgX19jb21wbGV4X18gZmxvYXQgZmxvYXRfdHlwZTsgZmxvYXRfdHlwZSB0bXBmOwoJICAgICAgICAgICAgY2Fjb3NmKHRtcGYpOwoJICAgICAgICAgICAgY2FzaW5mKHRtcGYpOwoJICAgICAgICAgICAgY2F0YW5mKHRtcGYpOwoJICAgICAgICAgICAgY2Fjb3NoZih0bXBmKTsKCSAgICAgICAgICAgIGNhc2luaGYodG1wZik7CgkgICAgICAgICAgICBjYXRhbmhmKHRtcGYpOwoJCSAgICB0eXBlZGVmIF9fY29tcGxleF9fIGRvdWJsZSBkb3VibGVfdHlwZTsgZG91YmxlX3R5cGUgdG1wZDsKCSAgICAgICAgICAgIGNhY29zKHRtcGQpOwoJICAgICAgICAgICAgY2FzaW4odG1wZCk7CgkgICAgICAgICAgICBjYXRhbih0bXBkKTsKCSAgICAgICAgICAgIGNhY29zaCh0bXBkKTsKCSAgICAgICAgICAgIGNhc2luaCh0bXBkKTsKCSAgICAgICAgICAgIGNhdGFuaCh0bXBkKTsKCQkgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSBsZF90eXBlOyBsZF90eXBlIHRtcGxkOwoJICAgICAgICAgICAgY2Fjb3NsKHRtcGxkKTsKCSAgICAgICAgICAgIGNhc2lubCh0bXBsZCk7CgkgICAgICAgICAgICBjYXRhbmwodG1wbGQpOwoJICAgICAgICAgICAgY2Fjb3NobCh0bXBsZCk7CgkgICAgICAgICAgICBjYXNpbmhsKHRtcGxkKTsKCSAgICAgICAgICAgIGNhdGFuaGwodG1wbGQpOwoJCSAgIF0sW2FjX2M5OV9jb21wbGV4X3RyMT15ZXNdLCBbYWNfYzk5X2NvbXBsZXhfdHIxPW5vXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9jb21wbGV4X3RyMSkKICBpZiB0ZXN0IHgiJGFjX2M5OV9jb21wbGV4X3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbgogICAgICAgICAgICAgIDx0cjEvY29tcGxleD4uIFVzaW5nIGNvbXBpbGVyIGJ1aWx0aW5zIGZvciB0aGVzZSBmdW5jdGlvbnMKCSAgICAgIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkgZnVuY3Rpb25zIHRvIGJlIHByZXNlbnQuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxjdHlwZS5oPiBmdW5jdGlvbnMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8Y3R5cGUuaD5dKQogIEFDX0NBQ0hFX1ZBTChhY19jOTlfY3R5cGVfdHIxLCBbCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjdHlwZS5oPl0sCgkgICAgICAgICBbaW50IGNoOwoJICAgICAgICAgIGludCByZXQ7CgkgICAgICAgICAgcmV0ID0gaXNibGFuayhjaCk7CgkJIF0sW2FjX2M5OV9jdHlwZV90cjE9eWVzXSwgW2FjX2M5OV9jdHlwZV90cjE9bm9dKQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2N0eXBlX3RyMSkKICBpZiB0ZXN0IHgiJGFjX2M5OV9jdHlwZV90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KCSAgICAgIDx0cjEvY2N0eXBlPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxmZW52Lmg+IGZ1bmN0aW9ucy4KICBBQ19DSEVDS19IRUFERVJTKGZlbnYuaCwgYWNfaGFzX2ZlbnZfaD15ZXMsIGFjX2hhc19mZW52X2g9bm8pCiAgYWNfYzk5X2ZlbnZfdHIxPW5vOwogIGlmIHRlc3QgeCIkYWNfaGFzX2ZlbnZfaCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGZlbnYuaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxmZW52Lmg+XSwKCSAgICAgICAgICAgW2ludCBleGNlcHQsIG1vZGU7CgkgICAgICAgICAgICBmZXhjZXB0X3QqIHBmbGFnOwogICAgICAgICAgICAgICAgICAgIGZlbnZfdCogcGVudjsKCSAgICAgICAgICAgIGludCByZXQ7CgkgICAgICAgICAgICByZXQgPSBmZWNsZWFyZXhjZXB0KGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZWdldGV4Y2VwdGZsYWcocGZsYWcsIGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXJhaXNlZXhjZXB0KGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXNldGV4Y2VwdGZsYWcocGZsYWcsIGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXRlc3RleGNlcHQoZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZlZ2V0cm91bmQoKTsKCSAgICAgICAgICAgIHJldCA9IGZlc2V0cm91bmQobW9kZSk7CgkgICAgICAgICAgICByZXQgPSBmZWdldGVudihwZW52KTsKCSAgICAgICAgICAgIHJldCA9IGZlaG9sZGV4Y2VwdChwZW52KTsKCSAgICAgICAgICAgIHJldCA9IGZlc2V0ZW52KHBlbnYpOwoJICAgICAgICAgICAgcmV0ID0gZmV1cGRhdGVlbnYocGVudik7CgkJICAgXSxbYWNfYzk5X2ZlbnZfdHIxPXllc10sIFthY19jOTlfZmVudl90cjE9bm9dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2ZlbnZfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X2ZlbnZfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxmZW52Lmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgoJICAgICAgPHRyMS9jZmVudj4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLl0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8c3RkaW50Lmg+IHR5cGVzLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPHN0ZGludC5oPl0pCiAgQUNfQ0FDSEVfVkFMKGFjX2M5OV9zdGRpbnRfdHIxLCBbCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRpbnQuaD5dLAoJICAgICAgICAgW3R5cGVkZWYgaW50OF90ICAgICAgICAgIG15X2ludDhfdDsKCSAgICAgICAgICB0eXBlZGVmIGludDE2X3QgICAgICAgICBteV9pbnQxNl90OwoJICAgICAgICAgIHR5cGVkZWYgaW50MzJfdCAgICAgICAgIG15X2ludDMyX3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnQ2NF90ICAgICAgICAgbXlfaW50NjRfdDsKCSAgICAgICAgICB0eXBlZGVmIGludF9mYXN0OF90ICAgICBteV9pbnRfZmFzdDhfdDsKCSAgICAgICAgICB0eXBlZGVmIGludF9mYXN0MTZfdCAgICBteV9pbnRfZmFzdDE2X3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfZmFzdDMyX3QgICAgbXlfaW50X2Zhc3QzMl90OwoJICAgICAgICAgIHR5cGVkZWYgaW50X2Zhc3Q2NF90ICAgIG15X2ludF9mYXN0NjRfdDsJCgkgICAgICAgICAgdHlwZWRlZiBpbnRfbGVhc3Q4X3QgICAgbXlfaW50X2xlYXN0OF90OwoJICAgICAgICAgIHR5cGVkZWYgaW50X2xlYXN0MTZfdCAgIG15X2ludF9sZWFzdDE2X3Q7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfbGVhc3QzMl90ICAgbXlfaW50X2xlYXN0MzJfdDsKCSAgICAgICAgICB0eXBlZGVmIGludF9sZWFzdDY0X3QgICBteV9pbnRfbGVhc3Q2NF90OwoJCSAgdHlwZWRlZiBpbnRtYXhfdCAgICAgICAgbXlfaW50bWF4X3Q7CgkJICB0eXBlZGVmIGludHB0cl90ICAgICAgICBteV9pbnRwdHJfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnQ4X3QgICAgICAgICBteV91aW50OF90OwoJICAgICAgICAgIHR5cGVkZWYgdWludDE2X3QgICAgICAgIG15X3VpbnQxNl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludDMyX3QgICAgICAgIG15X3VpbnQzMl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludDY0X3QgICAgICAgIG15X3VpbnQ2NF90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0OF90ICAgIG15X3VpbnRfZmFzdDhfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfZmFzdDE2X3QgICBteV91aW50X2Zhc3QxNl90OwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0MzJfdCAgIG15X3VpbnRfZmFzdDMyX3Q7CgkgICAgICAgICAgdHlwZWRlZiB1aW50X2Zhc3Q2NF90ICAgbXlfdWludF9mYXN0NjRfdDsJCgkgICAgICAgICAgdHlwZWRlZiB1aW50X2xlYXN0OF90ICAgbXlfdWludF9sZWFzdDhfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3QxNl90ICBteV91aW50X2xlYXN0MTZfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3QzMl90ICBteV91aW50X2xlYXN0MzJfdDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3Q2NF90ICBteV91aW50X2xlYXN0NjRfdDsKCQkgIHR5cGVkZWYgdWludG1heF90ICAgICAgIG15X3VpbnRtYXhfdDsKCQkgIHR5cGVkZWYgdWludHB0cl90ICAgICAgIG15X3VpbnRwdHJfdDsKCQkgXSxbYWNfYzk5X3N0ZGludF90cjE9eWVzXSwgW2FjX2M5OV9zdGRpbnRfdHIxPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9zdGRpbnRfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X3N0ZGludF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IHR5cGVzIGluIDxzdGRpbnQuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCgkgICAgICA8dHIxL2NzdGRpbnQ+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPG1hdGguaD4gZnVuY3Rpb25zLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPG1hdGguaD5dKQogIEFDX0NBQ0hFX1ZBTChhY19jOTlfbWF0aF90cjEsIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPG1hdGguaD5dLAoJICAgICAgICAgW3R5cGVkZWYgZG91YmxlX3QgIG15X2RvdWJsZV90OwoJICAgICAgICAgIHR5cGVkZWYgZmxvYXRfdCAgIG15X2Zsb2F0X3Q7CgkgICAgICAgICAgYWNvc2goMC4wKTsKCSAgICAgICAgICBhY29zaGYoMC4wZik7CgkgICAgICAgICAgYWNvc2hsKDAuMGwpOwoJICAgICAgICAgIGFzaW5oKDAuMCk7CgkgICAgICAgICAgYXNpbmhmKDAuMGYpOwoJICAgICAgICAgIGFzaW5obCgwLjBsKTsKCSAgICAgICAgICBhdGFuaCgwLjApOwoJICAgICAgICAgIGF0YW5oZigwLjBmKTsKCSAgICAgICAgICBhdGFuaGwoMC4wbCk7CgkgICAgICAgICAgY2JydCgwLjApOwoJICAgICAgICAgIGNicnRmKDAuMGYpOwoJICAgICAgICAgIGNicnRsKDAuMGwpOwoJICAgICAgICAgIGNvcHlzaWduKDAuMCwgMC4wKTsKCSAgICAgICAgICBjb3B5c2lnbmYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgY29weXNpZ25sKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGVyZigwLjApOwoJICAgICAgICAgIGVyZmYoMC4wZik7CgkgICAgICAgICAgZXJmbCgwLjBsKTsKCSAgICAgICAgICBlcmZjKDAuMCk7CgkgICAgICAgICAgZXJmY2YoMC4wZik7CgkgICAgICAgICAgZXJmY2woMC4wbCk7CgkgICAgICAgICAgZXhwMigwLjApOwoJICAgICAgICAgIGV4cDJmKDAuMGYpOwoJICAgICAgICAgIGV4cDJsKDAuMGwpOwoJICAgICAgICAgIGV4cG0xKDAuMCk7CgkgICAgICAgICAgZXhwbTFmKDAuMGYpOwoJICAgICAgICAgIGV4cG0xbCgwLjBsKTsKCSAgICAgICAgICBmZGltKDAuMCwgMC4wKTsKCSAgICAgICAgICBmZGltZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBmZGltbCgwLjBsLCAwLjBsKTsKCSAgICAgICAgICBmbWEoMC4wLCAwLjAsIDAuMCk7CgkgICAgICAgICAgZm1hZigwLjBmLCAwLjBmLCAwLjBmKTsKCSAgICAgICAgICBmbWFsKDAuMGwsIDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGZtYXgoMC4wLCAwLjApOwoJICAgICAgICAgIGZtYXhmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZtYXhsKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGZtaW4oMC4wLCAwLjApOwoJICAgICAgICAgIGZtaW5mKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZtaW5sKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGh5cG90KDAuMCwgMC4wKTsKCSAgICAgICAgICBoeXBvdGYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgaHlwb3RsKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGlsb2diKDAuMCk7CgkgICAgICAgICAgaWxvZ2JmKDAuMGYpOwoJICAgICAgICAgIGlsb2dibCgwLjBsKTsKCSAgICAgICAgICBsZ2FtbWEoMC4wKTsKCSAgICAgICAgICBsZ2FtbWFmKDAuMGYpOwoJICAgICAgICAgIGxnYW1tYWwoMC4wbCk7CgkgICAgICAgICAgbGxyaW50KDAuMCk7CgkgICAgICAgICAgbGxyaW50ZigwLjBmKTsKCSAgICAgICAgICBsbHJpbnRsKDAuMGwpOwoJICAgICAgICAgIGxscm91bmQoMC4wKTsKCSAgICAgICAgICBsbHJvdW5kZigwLjBmKTsKCSAgICAgICAgICBsbHJvdW5kbCgwLjBsKTsKCSAgICAgICAgICBsb2cxcCgwLjApOwoJICAgICAgICAgIGxvZzFwZigwLjBmKTsKCSAgICAgICAgICBsb2cxcGwoMC4wbCk7CgkgICAgICAgICAgbG9nMigwLjApOwoJICAgICAgICAgIGxvZzJmKDAuMGYpOwoJICAgICAgICAgIGxvZzJsKDAuMGwpOwoJICAgICAgICAgIGxvZ2IoMC4wKTsKCSAgICAgICAgICBsb2diZigwLjBmKTsKCSAgICAgICAgICBsb2dibCgwLjBsKTsKCSAgICAgICAgICBscmludCgwLjApOwoJICAgICAgICAgIGxyaW50ZigwLjBmKTsKCSAgICAgICAgICBscmludGwoMC4wbCk7CgkgICAgICAgICAgbHJvdW5kKDAuMCk7CgkgICAgICAgICAgbHJvdW5kZigwLjBmKTsKCSAgICAgICAgICBscm91bmRsKDAuMGwpOwoJICAgICAgICAgIG5hbigwKTsKCSAgICAgICAgICBuYW5mKDApOwoJICAgICAgICAgIG5hbmwoMCk7CgkgICAgICAgICAgbmVhcmJ5aW50KDAuMCk7CgkgICAgICAgICAgbmVhcmJ5aW50ZigwLjBmKTsKCSAgICAgICAgICBuZWFyYnlpbnRsKDAuMGwpOwoJICAgICAgICAgIG5leHRhZnRlcigwLjAsIDAuMCk7CgkgICAgICAgICAgbmV4dGFmdGVyZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBuZXh0YWZ0ZXJsKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIG5leHR0b3dhcmQoMC4wLCAwLjApOwoJICAgICAgICAgIG5leHR0b3dhcmRmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIG5leHR0b3dhcmRsKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIHJlbWFpbmRlcigwLjAsIDAuMCk7CgkgICAgICAgICAgcmVtYWluZGVyZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICByZW1haW5kZXJsKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIHJlbXF1bygwLjAsIDAuMCwgMCk7CgkgICAgICAgICAgcmVtcXVvKDAuMGYsIDAuMGYsIDApOwoJICAgICAgICAgIHJlbXF1bygwLjBsLCAwLjBsLCAwKTsKCSAgICAgICAgICByaW50KDAuMCk7CgkgICAgICAgICAgcmludGYoMC4wZik7CgkgICAgICAgICAgcmludGwoMC4wbCk7CgkgICAgICAgICAgcm91bmQoMC4wKTsKCSAgICAgICAgICByb3VuZGYoMC4wZik7CgkgICAgICAgICAgcm91bmRsKDAuMGwpOwoJICAgICAgICAgIHNjYWxibG4oMC4wLCAwbCk7CgkgICAgICAgICAgc2NhbGJsbmYoMC4wZiwgMGwpOwoJICAgICAgICAgIHNjYWxibG5sKDAuMGwsIDBsKTsKCSAgICAgICAgICBzY2FsYm4oMC4wLCAwKTsKCSAgICAgICAgICBzY2FsYm5mKDAuMGYsIDApOwoJICAgICAgICAgIHNjYWxibmwoMC4wbCwgMCk7CgkgICAgICAgICAgdGdhbW1hKDAuMCk7CgkgICAgICAgICAgdGdhbW1hZigwLjBmKTsKCSAgICAgICAgICB0Z2FtbWFsKDAuMGwpOwoJICAgICAgICAgIHRydW5jKDAuMCk7CgkgICAgICAgICAgdHJ1bmNmKDAuMGYpOwoJICAgICAgICAgIHRydW5jbCgwLjBsKTsKCQkgXSxbYWNfYzk5X21hdGhfdHIxPXllc10sIFthY19jOTlfbWF0aF90cjE9bm9dKQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X21hdGhfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X21hdGhfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBpbiA8bWF0aC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQKICAgICAgICAgICAgICBpbiA8dHIxL2NtYXRoPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxpbnR0eXBlcy5oPiBmdW5jdGlvbnMgKE5COiBkb2Vzbid0IG1ha2UKICAjIHNlbnNlIGlmIHRoZSBwcmV2aW91cyBjaGVjayBmYWlscywgcGVyIEM5OSwgNy44LzEpLgogIGFjX2M5OV9pbnR0eXBlc190cjE9bm87CiAgaWYgdGVzdCB4IiRhY19jOTlfc3RkaW50X3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGludHR5cGVzLmg+XSkKICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8aW50dHlwZXMuaD5dLAoJICAgICAgICAgICBbaW50bWF4X3QgaSwgbnVtZXIsIGRlbm9tLCBiYXNlOwoJICAgICAgICAgICAgY29uc3QgY2hhciogczsKCSAgICAgICAgICAgIGNoYXIqKiBlbmRwdHI7CgkgICAgICAgICAgICBpbnRtYXhfdCByZXQgPSBpbWF4YWJzKGkpOwoJICAgICAgICAgICAgaW1heGRpdl90IGRyZXQgPSBpbWF4ZGl2KG51bWVyLCBkZW5vbSk7CgkgICAgICAgICAgICByZXQgPSBzdHJ0b2ltYXgocywgZW5kcHRyLCBiYXNlKTsKCSAgICAgICAgICAgIHVpbnRtYXhfdCB1cmV0ID0gc3RydG91bWF4KHMsIGVuZHB0ciwgYmFzZSk7CiAgICAgICAgCSAgIF0sW2FjX2M5OV9pbnR0eXBlc190cjE9eWVzXSwgW2FjX2M5OV9pbnR0eXBlc190cjE9bm9dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2ludHR5cGVzX3RyMSkKICBpZiB0ZXN0IHgiJGFjX2M5OV9pbnR0eXBlc190cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxpbnR0eXBlcy5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KICAgICAgICAgICAgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLl0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgPHN0ZGJvb2wuaD4gaGVhZGVyLgkKICBBQ19DSEVDS19IRUFERVJTKHN0ZGJvb2wuaCkKCiAgQUNfTEFOR19SRVNUT1JFCl0pCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgImRldi9yYW5kb20iIGFuZCAiZGV2L3VyYW5kb20iIGFyZSBhdmFpbGFibGUgZm9yIHRoZQpkbmwgcmFuZG9tX2RldmljZSBvZiAiVFIxIiAoQ2hhcHRlciA1LjEsICJSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24iKS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1JBTkRPTV9UUjFdLCBbCgogIEFDX01TR19DSEVDS0lORyhbZm9yICJkZXYvcmFuZG9tIiBhbmQgImRldi91cmFuZG9tIiBmb3IgVFIxIHJhbmRvbV9kZXZpY2VdKQogIEFDX0NBQ0hFX1ZBTChhY19yYW5kb21fdHIxLCBbCiAgQUNfVFJZX1JVTihbI2luY2x1ZGUgPHN0ZGlvLmg+CgkgICAgICBpbnQgbWFpbigpCgkgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gIShmb3BlbigiL2Rldi9yYW5kb20iLCAiciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3BlbigiL2Rldi91cmFuZG9tIiwgInIiKSk7CgkgICAgICB9CSAgICAgIAoJICAgICBdLAogICAgICAgICAgICAgW2FjX3JhbmRvbV90cjE9eWVzXSwgW2FjX3JhbmRvbV90cjE9bm9dLAoJICAgICBbYWNfcmFuZG9tX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRhY19yYW5kb21fdHIxKQogIGlmIHRlc3QgeCIkYWNfcmFuZG9tX3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfUkFORE9NX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGRldi9yYW5kb20gYW5kIGRldi91cmFuZG9tIGFyZSBhdmFpbGFibGUgZm9yCgkgICAgICAgdGhlIHJhbmRvbV9kZXZpY2Ugb2YgVFIxIChDaGFwdGVyIDUuMSkuXSkKICBmaQoKXSkKCmRubApkbmwgQ2hlY2sgZm9yIHdoYXQgdHlwZSBvZiBDIGhlYWRlcnMgdG8gdXNlLgpkbmwKZG5sIC0tZW5hYmxlLWNoZWFkZXJzPSBbZG9lcyBzdHVmZl0uCmRubCAtLWRpc2FibGUtY2hlYWRlcnMgW2RvZXMgbm90IGRvIGFueXRoaW5nLCByZWFsbHldLgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfQ0hFQURFUlNbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYGMnIG9yIGBjX3N0ZCcuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ0hFQURFUlNdLCBbCiAgR0xJQkNYWF9FTkFCTEUoY2hlYWRlcnMsJDEsWz1LSU5EXSwKICAgIFtjb25zdHJ1Y3QgIkMiIGhlYWRlcnMgZm9yIGcrK10sIFtwZXJtaXQgY3xjX3N0ZF0pCiAgQUNfTVNHX05PVElDRSgiQyIgaGVhZGVyIHN0cmF0ZWd5IHNldCB0byAkZW5hYmxlX2NoZWFkZXJzKQoKICBDX0lOQ0xVREVfRElSPScke2dsaWJjeHhfc3JjZGlyfS9pbmNsdWRlLyckZW5hYmxlX2NoZWFkZXJzCgogIEFDX1NVQlNUKENfSU5DTFVERV9ESVIpCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0NfSEVBREVSU19DLCB0ZXN0ICRlbmFibGVfY2hlYWRlcnMgPSBjKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQ19TVEQsIHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfc3RkKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQ09NUEFUSUJJTElUWSwgdGVzdCAkY19jb21wYXRpYmlsaXR5ID0geWVzKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdoaWNoIGxvY2FsZSBsaWJyYXJ5IHRvIHVzZS4gIFRoZSBjaG9pY2UgaXMgbWFwcGVkIHRvCmRubCBhIHN1YmRpcmVjdG9yeSBvZiBjb25maWcvbG9jYWxlLgpkbmwKZG5sIERlZmF1bHQgaXMgZ2VuZXJpYy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DTE9DQUxFXSwgWwogIEdMSUJDWFhfRU5BQkxFKGNsb2NhbGUsYXV0byxbQDw6QD1NT0RFTEA6PkBdLAogICAgW3VzZSBNT0RFTCBmb3IgdGFyZ2V0IGxvY2FsZSBwYWNrYWdlXSwKICAgIFtwZXJtaXQgZ2VuZXJpY3xnbnV8aWVlZV8xMDAzLjEtMjAwMXx5ZXN8bm98YXV0b10pCgogICMgRGVhbCB3aXRoIGdldHRleHQgaXNzdWVzLiAgRGVmYXVsdCB0byBub3QgdXNpbmcgaXQgKD1ubykgdW50aWwgd2UgZGV0ZWN0CiAgIyBzdXBwb3J0IGZvciBpdCBsYXRlci4gIExldCB0aGUgdXNlciB0dXJuIGl0IG9mZiB2aWEgLS1lL2QsIGJ1dCBsZXQgdGhhdAogICMgZGVmYXVsdCB0byBvbiBmb3IgZWFzaWVyIGhhbmRsaW5nLgogIFVTRV9OTFM9bm8KICBBQ19BUkdfRU5BQkxFKG5scywKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ubHNdLFt1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQgKGRlZmF1bHQpXSksCiAgICBbXSwKICAgIFtlbmFibGVfbmxzPXllc10pCiAgCiAgIyBFaXRoZXIgYSBrbm93biBwYWNrYWFnZSwgb3IgImF1dG8iCiAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGUgPSBubyB8fCB0ZXN0ICRlbmFibGVfY2xvY2FsZSA9IHllczsgdGhlbgogICAgIGVuYWJsZV9jbG9jYWxlPWF1dG8KICBmaQogIGVuYWJsZV9jbG9jYWxlX2ZsYWc9JGVuYWJsZV9jbG9jYWxlCgogICMgUHJvYmUgZm9yIGxvY2FsZSBtb2RlbCB0byB1c2UgaWYgbm9uZSBzcGVjaWZpZWQuCiAgIyBEZWZhdWx0IHRvICJnZW5lcmljIi4KICBpZiB0ZXN0ICRlbmFibGVfY2xvY2FsZV9mbGFnID0gYXV0bzsgdGhlbgogICAgY2FzZSAke3RhcmdldF9vc30gaW4KICAgICAgbGludXgqIHwgZ251KiB8IGtmcmVlYnNkKi1nbnUgfCBrbmV0YnNkKi1nbnUpCiAgICAgICAgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nbnUJCiAgICAgICAgOzsKICAgICAgZGFyd2luKiB8IGZyZWVic2QqKQogICAgICAgIGVuYWJsZV9jbG9jYWxlX2ZsYWc9ZGFyd2luCgk7OwogICAgICAqKQogICAgICAgIGVuYWJsZV9jbG9jYWxlX2ZsYWc9Z2VuZXJpYwogICAgICAgIDs7CiAgICBlc2FjCiAgZmkKCiAgIyBTYW5pdHkgY2hlY2sgbW9kZWwsIGFuZCB0ZXN0IGZvciBzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuCiAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGVfZmxhZyA9IGdudTsgdGhlbgogICAgQUNfRUdSRVBfQ1BQKFtfR0xJQkNYWF9va10sIFsKICAgICNpbmNsdWRlIDxmZWF0dXJlcy5oPgogICAgI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKQogICAgICBfR0xJQkNYWF9vawogICAgI2VuZGlmCiAgICBdLCBlbmFibGVfY2xvY2FsZV9mbGFnPWdudSwgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljKQoKICAgICMgVGVzdCBmb3IgYnVncyBlYXJseSBpbiBnbGliYy0yLjIueCBzZXJpZXMKICAgIEFDX1RSWV9SVU4oWwogICAgI2RlZmluZSBfR05VX1NPVVJDRSAxCiAgICAjaW5jbHVkZSA8bG9jYWxlLmg+CiAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CiAgICAjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKICAgIGV4dGVybiBfX3R5cGVvZihuZXdsb2NhbGUpIF9fbmV3bG9jYWxlOwogICAgZXh0ZXJuIF9fdHlwZW9mKGR1cGxvY2FsZSkgX19kdXBsb2NhbGU7CiAgICBleHRlcm4gX190eXBlb2Yoc3RyY29sbF9sKSBfX3N0cmNvbGxfbDsKICAgICNlbmRpZgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgX19vbmVbXSA9ICLEdWdsZWluIEF1Z21lbiI7CiAgICAgICAgY29uc3QgY2hhciBfX3R3b1tdID0gIsR1Z2xlaW4iOwogICAgICAgIGludCBpOwogICAgICAgIGludCBqOwogICAgICAgIF9fbG9jYWxlX3QgICAgICAgIGxvYzsKICAgICAgICBfX2xvY2FsZV90ICAgICAgICBsb2NfZHVwOwogICAgICAgIGxvYyA9IF9fbmV3bG9jYWxlKDEgPDwgTENfQUxMLCAiZGVfREUiLCAwKTsKICAgICAgICBsb2NfZHVwID0gX19kdXBsb2NhbGUobG9jKTsKICAgICAgICBpID0gX19zdHJjb2xsX2woX19vbmUsIF9fdHdvLCBsb2MpOwogICAgICAgIGogPSBfX3N0cmNvbGxfbChfX29uZSwgX190d28sIGxvY19kdXApOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgXSwKICAgIFtlbmFibGVfY2xvY2FsZV9mbGFnPWdudV0sW2VuYWJsZV9jbG9jYWxlX2ZsYWc9Z2VuZXJpY10sCiAgICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljXSkKCiAgICAjIFNldCBpdCB0byBzY3JlYW0gd2hlbiBpdCBodXJ0cy4KICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgkKICAgIENGTEFHUz0iLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2Vycm9yIgoKICAgICMgVXNlIHN0cnhmcm1fbCBpZiBhdmFpbGFibGUuCiAgICBBQ19UUllfQ09NUElMRShbI2RlZmluZSBfR05VX1NPVVJDRSAxCiAgICAgCQkgICAgI2luY2x1ZGUgPHN0cmluZy5oPgoJCSAgICAjaW5jbHVkZSA8bG9jYWxlLmg+XSwKCSAgICAgICAgICAgIFtjaGFyIHNbMTI4XTsgX19sb2NhbGVfdCBsb2M7IHN0cnhmcm1fbChzLCAiQyIsIDUsIGxvYyk7XSwgCiAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSWEZSTV9MLCAxLCAKICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIHN0cnhmcm1fbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi5dKSwpCiAgICAKICAgICMgVXNlIHN0cmVycm9yX2wgaWYgYXZhaWxhYmxlLgogICAgQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQoJCSAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CgkJICAgICNpbmNsdWRlIDxsb2NhbGUuaD5dLAoJICAgICAgICAgICAgW19fbG9jYWxlX3QgbG9jOyBzdHJlcnJvcl9sKDUsIGxvYyk7XSwgCiAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1JfTCwgMSwgCiAgICAgICAgICAgICAgICAgICAgW0RlZmluZSBpZiBzdHJlcnJvcl9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+Ll0pLCkKCiAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKICBmaQoKICAjIFBlcmhhcHMgdXNlIHN0cmVycm9yX3IgaWYgYXZhaWxhYmxlLCBhbmQgc3RyZXJyb3JfbCBpc24ndC4KICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIJCiAgQ0ZMQUdTPSItV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZXJyb3IiCiAgQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQoJICAgICAJICAjaW5jbHVkZSA8c3RyaW5nLmg+CgkJICAjaW5jbHVkZSA8bG9jYWxlLmg+XSwKCSAgICAgICAgICBbY2hhciBzWzEyOF07IHN0cmVycm9yX3IoNSwgcywgMTI4KTtdLCAKICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1JfUiwgMSwgCiAgICAgICAgICAgICAgICAgIFtEZWZpbmUgaWYgc3RyZXJyb3JfciBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi5dKSwpCiAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCgogICMgU2V0IGNvbmZpZ3VyZSBiaXRzIGZvciBzcGVjaWZpZWQgbG9jYWxlIHBhY2thZ2UKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBDIGxvY2FsZSB0byB1c2VdKQogIGNhc2UgJHtlbmFibGVfY2xvY2FsZV9mbGFnfSBpbgogICAgZ2VuZXJpYykKICAgICAgQUNfTVNHX1JFU1VMVChnZW5lcmljKQoKICAgICAgQ0xPQ0FMRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2N0eXBlX21lbWJlcnMuY2MKICAgICAgQ01FU1NBR0VTX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuaAogICAgICBDTUVTU0FHRVNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tb25ldGFyeV9tZW1iZXJzLmNjCiAgICAgIENOVU1FUklDX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9udW1lcmljX21lbWJlcnMuY2MKICAgICAgQ1RJTUVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5jYwogICAgICBDTE9DQUxFX0lOVEVSTkFMX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2MrK2xvY2FsZV9pbnRlcm5hbC5oCiAgICAgIDs7CiAgICBkYXJ3aW4pCiAgICAgIEFDX01TR19SRVNVTFQoZGFyd2luIG9yIGZyZWVic2QpCgogICAgICBDTE9DQUxFX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NfbG9jYWxlLmgKICAgICAgQ0xPQ0FMRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2Rhcndpbi9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwoJCiAgICBnbnUpCiAgICAgIEFDX01TR19SRVNVTFQoZ251KQoKICAgICAgIyBEZWNsYXJlIGludGVudGlvbiB0byB1c2UgZ2V0dGV4dCwgYW5kIGFkZCBzdXBwb3J0IGZvciBzcGVjaWZpYwogICAgICAjIGxhbmd1YWdlcy4KICAgICAgIyBGb3Igc29tZSByZWFzb24sIEFMTF9MSU5HVUFTIGhhcyB0byBiZSBiZWZvcmUgQU0tR05VLUdFVFRFWFQKICAgICAgQUxMX0xJTkdVQVM9ImRlIGZyIgoKICAgICAgIyBEb24ndCBjYWxsIEFNLUdOVS1HRVRURVhUIGhlcmUuIEluc3RlYWQsIGFzc3VtZSBnbGliYy4KICAgICAgQUNfQ0hFQ0tfUFJPRyhjaGVja19tc2dmbXQsIG1zZ2ZtdCwgeWVzLCBubykKICAgICAgaWYgdGVzdCB4IiRjaGVja19tc2dmbXQiID0geCJ5ZXMiICYmIHRlc3QgeCIkZW5hYmxlX25scyIgPSB4InllcyI7IHRoZW4KICAgICAgICBVU0VfTkxTPXllcwogICAgICBmaQogICAgICAjIEV4cG9ydCB0aGUgYnVpbGQgb2JqZWN0cy4KICAgICAgZm9yIGxpbmcgaW4gJEFMTF9MSU5HVUFTOyBkbyBcCiAgICAgICAgZ2xpYmN4eF9NT0ZJTEVTPSIkZ2xpYmN4eF9NT0ZJTEVTICRsaW5nLm1vIjsgXAogICAgICAgIGdsaWJjeHhfUE9GSUxFUz0iJGdsaWJjeHhfUE9GSUxFUyAkbGluZy5wbyI7IFwKICAgICAgZG9uZQogICAgICBBQ19TVUJTVChnbGliY3h4X01PRklMRVMpCiAgICAgIEFDX1NVQlNUKGdsaWJjeHhfUE9GSUxFUykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dudS9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY29kZWN2dF9tZW1iZXJzLmNjCiAgICAgIENDT0xMQVRFX0NDPWNvbmZpZy9sb2NhbGUvZ251L2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2dudS9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvZ251L21lc3NhZ2VzX21lbWJlcnMuY2MKICAgICAgQ01PTkVZX0NDPWNvbmZpZy9sb2NhbGUvZ251L21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nbnUvdGltZV9tZW1iZXJzLmgKICAgICAgQ1RJTUVfQ0M9Y29uZmlnL2xvY2FsZS9nbnUvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dudS9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwogICAgaWVlZV8xMDAzLjEtMjAwMSkKICAgICAgQUNfTVNHX1JFU1VMVChJRUVFIDEwMDMuMSkKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9jX2xvY2FsZS5jYwogICAgICBDQ09ERUNWVF9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29kZWN2dF9tZW1iZXJzLmNjCiAgICAgIENDT0xMQVRFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2xsYXRlX21lbWJlcnMuY2MKICAgICAgQ0NUWVBFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvaWVlZV8xMDAzLjEtMjAwMS9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwogIGVzYWMKCiAgIyBUaGlzIGlzIHdoZXJlIHRoZSB0ZXN0c3VpdGUgbG9va3MgZm9yIGxvY2FsZSBjYXRhbG9ncywgdXNpbmcgdGhlCiAgIyAtRExPQ0FMRURJUiBkZWZpbmUgZHVyaW5nIHRlc3RzdWl0ZSBjb21waWxhdGlvbi4KICBnbGliY3h4X2xvY2FsZWRpcj0ke2dsaWJjeHhfYnVpbGRkaXJ9L3BvL3NoYXJlL2xvY2FsZQogIEFDX1NVQlNUKGdsaWJjeHhfbG9jYWxlZGlyKQoKICAjIEEgc3RhbmRhbG9uZSBsaWJpbnRsIChlLmcuLCBHTlUgbGliaW50bCkgbWF5IGJlIGluIHVzZS4KICBpZiB0ZXN0ICRVU0VfTkxTID0geWVzOyB0aGVuCiAgICBBQ19DSEVDS19IRUFERVJTKFtsaWJpbnRsLmhdLCBbXSwgVVNFX05MUz1ubykKICAgIEFDX1NFQVJDSF9MSUJTKGdldHRleHQsIGludGwsIFtdLCBVU0VfTkxTPW5vKQogIGZpCiAgaWYgdGVzdCAkVVNFX05MUyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9OTFMsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgTkxTIHRyYW5zbGF0aW9ucyBhcmUgdG8gYmUgdXNlZC5dKQogIGZpCgogIEFDX1NVQlNUKFVTRV9OTFMpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9IKQogIEFDX1NVQlNUKENNRVNTQUdFU19IKQogIEFDX1NVQlNUKENDT0RFQ1ZUX0NDKQogIEFDX1NVQlNUKENDT0xMQVRFX0NDKQogIEFDX1NVQlNUKENDVFlQRV9DQykKICBBQ19TVUJTVChDTUVTU0FHRVNfQ0MpCiAgQUNfU1VCU1QoQ01PTkVZX0NDKQogIEFDX1NVQlNUKENOVU1FUklDX0NDKQogIEFDX1NVQlNUKENUSU1FX0gpCiAgQUNfU1VCU1QoQ1RJTUVfQ0MpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9DQykKICBBQ19TVUJTVChDTE9DQUxFX0lOVEVSTkFMX0gpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hpY2ggc3RkOjphbGxvY2F0b3IgYmFzZSBjbGFzcyB0byB1c2UuICBUaGUgY2hvaWNlIGlzCmRubCBtYXBwZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBvZiBpbmNsdWRlL2V4dC4KZG5sCmRubCBEZWZhdWx0IGlzIG5ldy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9BTExPQ0FUT1JdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkOjphbGxvY2F0b3IgYmFzZSBjbGFzc10pCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWFsbG9jYXRvcixhdXRvLFs9S0lORF0sCiAgICBbdXNlIEtJTkQgZm9yIHRhcmdldCBzdGQ6OmFsbG9jYXRvciBiYXNlXSwKICAgIFtwZXJtaXQgbmV3fG1hbGxvY3xtdHxiaXRtYXB8cG9vbHx5ZXN8bm98YXV0b10pCgogICMgSWYgdGhleSBkaWRuJ3QgdXNlIHRoaXMgb3B0aW9uIHN3aXRjaCwgb3IgaWYgdGhleSBzcGVjaWZpZWQgLS1lbmFibGUKICAjIHdpdGggbm8gc3BlY2lmaWMgbW9kZWwsIHdlJ2xsIGhhdmUgdG8gbG9vayBmb3Igb25lLiAgSWYgdGhleQogICMgc3BlY2lmaWVkIC0tZGlzYWJsZSAoPz8/KSwgZG8gbGlrZXdpc2UuCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3IgPSBubyB8fAogICAgIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yID0geWVzOwogIHRoZW4KICAgICBlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcj1hdXRvCiAgZmkKCiAgIyBFaXRoZXIgYSBrbm93biBwYWNrYWdlLCBvciAiYXV0byIuIEF1dG8gaW1wbGllcyB0aGUgZGVmYXVsdCBjaG9pY2UKICAjIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCiAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZz0kZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3IKCiAgIyBQcm9iZSBmb3IgaG9zdC1zcGVjaWZpYyBzdXBwb3J0IGlmIG5vIHNwZWNpZmljIG1vZGVsIGlzIHNwZWNpZmllZC4KICAjIERlZmF1bHQgdG8gIm5ldyIuCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZyA9IGF1dG87IHRoZW4KICAgIGNhc2UgJHt0YXJnZXRfb3N9IGluCiAgICAgIGxpbnV4KiB8IGdudSogfCBrZnJlZWJzZCotZ251IHwga25ldGJzZCotZ251KQogICAgICAgIGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWc9bmV3CiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnPW5ldwogICAgICAgIDs7CiAgICBlc2FjCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnKQogIAoKICAjIFNldCBjb25maWd1cmUgYml0cyBmb3Igc3BlY2lmaWVkIGxvY2FsZSBwYWNrYWdlCiAgY2FzZSAke2VuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWd9IGluCiAgICBiaXRtYXApCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvYml0bWFwX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjpiaXRtYXBfYWxsb2NhdG9yCiAgICAgIDs7CiAgICBtYWxsb2MpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvbWFsbG9jX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjptYWxsb2NfYWxsb2NhdG9yCiAgICAgIDs7CiAgICBtdCkKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9tdF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6X19tdF9hbGxvYwogICAgICA7OwogICAgbmV3KQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL25ld19hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6bmV3X2FsbG9jYXRvcgogICAgICA7OwogICAgcG9vbCkKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9wb29sX2FsbG9jYXRvcl9iYXNlLmgKICAgICAgQUxMT0NBVE9SX05BTUU9X19nbnVfY3h4OjpfX3Bvb2xfYWxsb2MKICAgICAgOzsJCiAgZXNhYwoKICBBQ19TVUJTVChBTExPQ0FUT1JfSCkKICBBQ19TVUJTVChBTExPQ0FUT1JfTkFNRSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGV0aGVyIHRoZSBCb29zdC1kZXJpdmVkIGNoZWNrcyBzaG91bGQgYmUgdHVybmVkIG9uLgpkbmwKZG5sIC0tZW5hYmxlLWNvbmNlcHQtY2hlY2tzIHR1cm5zIHRoZW0gb24uCmRubCAtLWRpc2FibGUtY29uY2VwdC1jaGVja3MgbGVhdmVzIHRoZW0gb2ZmLgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfQ09OQ0VQVF9DSEVDS1NbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DT05DRVBUX0NIRUNLU10sIFsKICBHTElCQ1hYX0VOQUJMRShjb25jZXB0LWNoZWNrcywkMSwsW3VzZSBCb29zdC1kZXJpdmVkIHRlbXBsYXRlIGNoZWNrc10pCiAgaWYgdGVzdCAkZW5hYmxlX2NvbmNlcHRfY2hlY2tzID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfQ09OQ0VQVF9DSEVDS1MsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSB0byB1c2UgY29uY2VwdCBjaGVja2luZyBjb2RlIGZyb20gdGhlIGJvb3N0IGxpYnJhcmllcy5dKQogIGZpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hpY2ggSS9PIGxpYnJhcnkgdG8gdXNlOiAgc3RkaW8sIG9yIHNvbWV0aGluZyBzcGVjaWZpYy4KZG5sCmRubCBEZWZhdWx0IGlzIHN0ZGlvLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NTVERJT10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1bmRlcmx5aW5nIEkvTyB0byB1c2VdKQogIEdMSUJDWFhfRU5BQkxFKGNzdGRpbyxzdGRpbyxbPVBBQ0tBR0VdLAogICAgW3VzZSB0YXJnZXQtc3BlY2lmaWMgSS9PIHBhY2thZ2VdLCBbcGVybWl0IHN0ZGlvXSkKCiAgIyBOb3cgdGhhdCBsaWJpbyBoYXMgYmVlbiByZW1vdmVkLCB5b3UgY2FuIGhhdmUgYW55IGNvbG9yIHlvdSB3YW50IGFzIGxvbmcKICAjIGFzIGl0J3MgYmxhY2suICBUaGlzIGlzIG9uZSBiaWcgbm8tb3AgdW50aWwgb3RoZXIgcGFja2FnZXMgYXJlIGFkZGVkLCBidXQKICAjIHNob3dpbmcgdGhlIGZyYW1ld29yayBuZXZlciBodXJ0cy4KICBjYXNlICR7ZW5hYmxlX2NzdGRpb30gaW4KICAgIHN0ZGlvKQogICAgICBDU1RESU9fSD1jb25maWcvaW8vY19pb19zdGRpby5oCiAgICAgIEJBU0lDX0ZJTEVfSD1jb25maWcvaW8vYmFzaWNfZmlsZV9zdGRpby5oCiAgICAgIEJBU0lDX0ZJTEVfQ0M9Y29uZmlnL2lvL2Jhc2ljX2ZpbGVfc3RkaW8uY2MKICAgICAgQUNfTVNHX1JFU1VMVChzdGRpbykKICAgICAgOzsKICBlc2FjCgogIEFDX1NVQlNUKENTVERJT19IKQogIEFDX1NVQlNUKEJBU0lDX0ZJTEVfSCkKICBBQ19TVUJTVChCQVNJQ19GSUxFX0NDKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yICJ1bnVzdWFsIiBmbGFncyB0byBwYXNzIHRvIHRoZSBjb21waWxlciB3aGlsZSBidWlsZGluZy4KZG5sCmRubCAtLWVuYWJsZS1jeHgtZmxhZ3M9Jy1mb28gLWJhciAtYmF6JyBpcyBhIGdlbmVyYWwgbWV0aG9kIGZvciBwYXNzaW5nCmRubCAgICAgZXhwZXJpbWVudGFsIGZsYWdzIHN1Y2ggYXMgLWZwY2gsIC1mSU1JLCAtRGZsb2F0PWNoYXIsIGV0Yy4KZG5sIC0tZGlzYWJsZS1jeHgtZmxhZ3MgcGFzc2VzIG5vdGhpbmcuCmRubCAgKyAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMi9tc2cwMDEzMS5odG1sCmRubCAgICAgICAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMi9tc2cwMDI4NC5odG1sCmRubCAgICAgICAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMC1xMS9tc2cwMDAzNS5odG1sCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9DWFhfRkxBR1MoZGVmYXVsdCBmbGFncykKZG5sICAgICAgIElmICJkZWZhdWx0IGZsYWdzIiBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUKZG5sICAgICAgIGFzIC0tZGlzYWJsZSBvciAtLWVuYWJsZT1uby4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DWFhfRkxBR1NdLCBbZG5sCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZXh0cmEgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nXSkKICBHTElCQ1hYX0VOQUJMRShjeHgtZmxhZ3MsJDEsWz1GTEFHU10sCiAgICBbcGFzcyBjb21waWxlciBGTEFHUyB3aGVuIGJ1aWxkaW5nIGxpYnJhcnldLAogICAgW2Nhc2UgIngkZW5hYmxlX2N4eF9mbGFncyIgaW4KICAgICAgeG5vIHwgeCkgICBlbmFibGVfY3h4X2ZsYWdzPSA7OwogICAgICB4LSopICAgICAgIDs7CiAgICAgICopICAgICAgICAgQUNfTVNHX0VSUk9SKF9nX3N3aXRjaCBuZWVkcyBjb21waWxlciBmbGFncyBhcyBhcmd1bWVudHMpIDs7CiAgICAgZXNhY10pCgogICMgUnVuIHRocm91Z2ggZmxhZ3MgKGVpdGhlciBkZWZhdWx0IG9yIGNvbW1hbmQtbGluZSkgYW5kIHNldCBhbnl0aGluZwogICMgZXh0cmEgKGUuZy4sICNkZWZpbmVzKSB0aGF0IG11c3QgYWNjb21wYW55IHBhcnRpY3VsYXIgZysrIG9wdGlvbnMuCiAgaWYgdGVzdCAtbiAiJGVuYWJsZV9jeHhfZmxhZ3MiOyB0aGVuCiAgICBmb3IgZiBpbiAkZW5hYmxlX2N4eF9mbGFnczsgZG8KICAgICAgY2FzZSAiJGYiIGluCiAgICAgICAgLWZob25vci1zdGQpICA7OwogICAgICAgIC0qKSAgOzsKICAgICAgICAqKSAgICMgYW5kIHdlJ3JlIHRyeWluZyB0byBwYXNzIC93aGF0LyBleGFjdGx5PwogICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtjb21waWxlciBmbGFncyBzdGFydCB3aXRoIGEgLV0pIDs7CiAgICAgIGVzYWMKICAgIGRvbmUKICBmaQoKICBFWFRSQV9DWFhfRkxBR1M9IiRlbmFibGVfY3h4X2ZsYWdzIgogIEFDX01TR19SRVNVTFQoJEVYVFJBX0NYWF9GTEFHUykKICBBQ19TVUJTVChFWFRSQV9DWFhfRkxBR1MpCl0pCgoKZG5sCmRubCBDaGVjayB0byBzZWUgaWYgZGVidWdnaW5nIGxpYnJhcmllcyBhcmUgdG8gYmUgYnVpbHQuCmRubApkbmwgLS1lbmFibGUtbGlic3RkY3h4LWRlYnVnCmRubCBidWlsZHMgYSBzZXBhcmF0ZSBzZXQgb2YgZGVidWdnaW5nIGxpYnJhcmllcyBpbiBhZGRpdGlvbiB0byB0aGUKZG5sIG5vcm1hbCAoc2hhcmVkLCBzdGF0aWMpIGxpYnN0ZGMrKyBiaW5hcmllcy4KZG5sCmRubCAtLWRpc2FibGUtbGlic3RkY3h4LWRlYnVnCmRubCBidWlsZHMgb25seSBvbmUgKG5vbi1kZWJ1ZykgdmVyc2lvbiBvZiBsaWJzdGRjKysuCmRubApkbmwgLS1lbmFibGUtbGlic3RkY3h4LWRlYnVnLWZsYWdzPUZMQUdTCmRubCBpZmYgLS1lbmFibGUtZGVidWcgPT0geWVzLCB0aGVuIHVzZSBGTEFHUyB0byBidWlsZCB0aGUgZGVidWcgbGlicmFyeS4KZG5sCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9ERUJVR1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0RFQlVHXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGFkZGl0aW9uYWwgZGVidWcgYnVpbGRdKQogIEdMSUJDWFhfRU5BQkxFKGxpYnN0ZGN4eC1kZWJ1ZywkMSwsW2J1aWxkIGV4dHJhIGRlYnVnIGxpYnJhcnldKQogIEFDX01TR19SRVNVTFQoJGVuYWJsZV9saWJzdGRjeHhfZGVidWcpCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0JVSUxEX0RFQlVHLCB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X2RlYnVnID0geWVzKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIGV4cGxpY2l0IGRlYnVnIGZsYWdzLgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1kZWJ1Zy1mbGFncz0nLU8xJwpkbmwgaXMgYSBnZW5lcmFsIG1ldGhvZCBmb3IgcGFzc2luZyBmbGFncyB0byBiZSB1c2VkIHdoZW4KZG5sIGJ1aWxkaW5nIGRlYnVnIGxpYnJhcmllcyB3aXRoIC0tZW5hYmxlLWRlYnVnLgpkbmwKZG5sIC0tZGlzYWJsZS1saWJzdGRjeHgtZGVidWctZmxhZ3MgZG9lcyBub3RoaW5nLgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfREVCVUdfRkxBR1MoZGVmYXVsdCBmbGFncykKZG5sICAgICAgIElmICJkZWZhdWx0IGZsYWdzIiBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUKZG5sICAgICAgIGFzIC0tZGlzYWJsZSBvciAtLWVuYWJsZT1uby4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9ERUJVR19GTEFHU10sIFsKICBHTElCQ1hYX0VOQUJMRShsaWJzdGRjeHgtZGVidWctZmxhZ3MsWyQxXSxbPUZMQUdTXSwKICAgIFtwYXNzIGNvbXBpbGVyIEZMQUdTIHdoZW4gYnVpbGRpbmcgZGVidWcgbGlicmFyeV0sCiAgICBbY2FzZSAieCRlbmFibGVfbGlic3RkY3h4X2RlYnVnX2ZsYWdzIiBpbgogICAgICB4bm8gfCB4KSAgICBlbmFibGVfbGlic3RkY3h4X2RlYnVnX2ZsYWdzPSA7OwogICAgICB4LSopICAgICAgICA7OwogICAgICAqKSAgICAgICAgICBBQ19NU0dfRVJST1IoX2dfc3dpdGNoIG5lZWRzIGNvbXBpbGVyIGZsYWdzIGFzIGFyZ3VtZW50cykgOzsKICAgICBlc2FjXSkKCiAgIyBPcHRpb24gcGFyc2VkLCBub3cgc2V0IHRoaW5ncyBhcHByb3ByaWF0ZWx5CiAgREVCVUdfRkxBR1M9IiRlbmFibGVfbGlic3RkY3h4X2RlYnVnX2ZsYWdzIgogIEFDX1NVQlNUKERFQlVHX0ZMQUdTKQoKICBBQ19NU0dfTk9USUNFKFtEZWJ1ZyBidWlsZCBmbGFncyBzZXQgdG8gJERFQlVHX0ZMQUdTXSkKXSkKCgpkbmwKZG5sIENoZWNrIGlmIHRoZSB1c2VyIG9ubHkgd2FudHMgYSBmcmVlc3RhbmRpbmcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4KZG5sCmRubCAtLWRpc2FibGUtaG9zdGVkLWxpYnN0ZGN4eCB3aWxsIHR1cm4gb2ZmIG1vc3Qgb2YgdGhlIGxpYnJhcnkgYnVpbGQsCmRubCBpbnN0YWxsaW5nIG9ubHkgdGhlIGhlYWRlcnMgcmVxdWlyZWQgYnkgWzE3LjQuMS4zXSBhbmQgdGhlIGxhbmd1YWdlCmRubCBzdXBwb3J0IGxpYnJhcnkuICBNb3JlIHRoYW4gdGhhdCB3aWxsIGJlIGJ1aWx0ICh0byBrZWVwIHRoZSBNYWtlZmlsZXMKZG5sIGNvbnZlbmllbnRseSBjbGVhbiksIGJ1dCBub3QgaW5zdGFsbGVkLgpkbmwKZG5sIFNldHM6CmRubCAgaXNfaG9zdGVkICAoeWVzL25vKQpkbmwKZG5sIERlZmluZXM6CmRubCAgX0dMSUJDWFhfSE9TVEVEICAgKGFsd2F5cyBkZWZpbmVkLCBlaXRoZXIgdG8gMSBvciAwKQpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0hPU1RFRF0sIFsKICBBQ19BUkdfRU5BQkxFKFtob3N0ZWQtbGlic3RkY3h4XSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaG9zdGVkLWxpYnN0ZGN4eF0sCiAgICAgICAgICAgICAgICAgICBbb25seSBidWlsZCBmcmVlc3RhbmRpbmcgQysrIHJ1bnRpbWUgc3VwcG9ydF0pLCwKICAgIFtjYXNlICIkaG9zdCIgaW4KCWFybSotKi1zeW1iaWFuZWxmKikgCgkgICAgZW5hYmxlX2hvc3RlZF9saWJzdGRjeHg9bm8KCSAgICA7OwogICAgICAgICopIAoJICAgIGVuYWJsZV9ob3N0ZWRfbGlic3RkY3h4PXllcwoJICAgIDs7CiAgICAgZXNhY10pCiAgaWYgdGVzdCAiJGVuYWJsZV9ob3N0ZWRfbGlic3RkY3h4IiA9IG5vOyB0aGVuCiAgICBBQ19NU0dfTk9USUNFKFtPbmx5IGZyZWVzdGFuZGluZyBsaWJyYXJpZXMgd2lsbCBiZSBidWlsdF0pCiAgICBpc19ob3N0ZWQ9bm8KICAgIGhvc3RlZF9kZWZpbmU9MAogICAgZW5hYmxlX2FiaV9jaGVjaz1ubwogICAgZW5hYmxlX2xpYnN0ZGN4eF9wY2g9bm8KICBlbHNlCiAgICBpc19ob3N0ZWQ9eWVzCiAgICBob3N0ZWRfZGVmaW5lPTEKICBmaQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9IT1NURUQsIHRlc3QgJGlzX2hvc3RlZCA9IHllcykKICBBQ19ERUZJTkVfVU5RVU9URUQoX0dMSUJDWFhfSE9TVEVELCAkaG9zdGVkX2RlZmluZSwKICAgIFtEZWZpbmUgdG8gMSBpZiBhIGZ1bGwgaG9zdGVkIGxpYnJhcnkgaXMgYnVpbHQsIG9yIDAgaWYgZnJlZXN0YW5kaW5nLl0pCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciB0aGUgJ2xvbmcgbG9uZycgdHlwZS4KZG5sIFRoZSByZXN1bHQgZGV0ZXJtaW5lcyBvbmx5IHdoZXRoZXIgJ2xvbmcgbG9uZycgSS9PIGlzIGVuYWJsZWQ7IHRoaW5ncwpkbmwgbGlrZSBudW1lcmljX2xpbWl0czw+IHNwZWNpYWxpemF0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZS4KZG5sCmRubCAtLWVuYWJsZS1sb25nLWxvbmcgZGVmaW5lcyBfR0xJQkNYWF9VU0VfTE9OR19MT05HCmRubCAtLWRpc2FibGUtbG9uZy1sb25nIGxlYXZlcyBfR0xJQkNYWF9VU0VfTE9OR19MT05HIHVuZGVmaW5lZApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfTE9OR19MT05HWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfTE9OR19MT05HXSwgWwogIEdMSUJDWFhfRU5BQkxFKGxvbmctbG9uZywkMSwsW2VuYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yICdsb25nIGxvbmcnXSkKICBpZiB0ZXN0ICRlbmFibGVfbG9uZ19sb25nID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0xPTkdfTE9ORywgMSwgCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciBsb25nIGxvbmcgc2hvdWxkIGJlIHVzZWQuXSkKICBmaQogIEFDX01TR19DSEVDS0lORyhbZm9yIGVuYWJsZWQgbG9uZyBsb25nIHNwZWNpYWxpemF0aW9uc10pCiAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9sb25nX2xvbmddKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgdGhlICd3Y2hhcl90JyB0eXBlLgpkbmwKZG5sIC0tZW5hYmxlLXdjaGFyX3QgZGVmaW5lcyBfR0xJQkNYWF9VU0VfV0NIQVJfVApkbmwgLS1kaXNhYmxlLXdjaGFyX3QgbGVhdmVzIF9HTElCQ1hYX1VTRV9XQ0hBUl9UIHVuZGVmaW5lZApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfV0NIQVJfVFsoREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwKZG5sIE5lY2Vzc2FyeSBzdXBwb3J0IG11c3QgYWxzbyBiZSBwcmVzZW50LgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1dDSEFSX1RdLCBbCiAgR0xJQkNYWF9FTkFCTEUod2NoYXJfdCwkMSwsW2VuYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yICd3Y2hhcl90J10pCgogICMgVGVzdCB3Y2hhci5oIGZvciBtYnN0YXRlX3QsIHdoaWNoIGlzIG5lZWRlZCBmb3IgY2hhcl90cmFpdHMgYW5kIGZwb3MuCiAgQUNfQ0hFQ0tfSEVBREVSUyh3Y2hhci5oLCBhY19oYXNfd2NoYXJfaD15ZXMsIGFjX2hhc193Y2hhcl9oPW5vKQogIEFDX01TR19DSEVDS0lORyhbZm9yIG1ic3RhdGVfdF0pCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPl0sCiAgW21ic3RhdGVfdCB0ZXN0c3RhdGU7XSwKICBoYXZlX21ic3RhdGVfdD15ZXMsIGhhdmVfbWJzdGF0ZV90PW5vKQogIEFDX01TR19SRVNVTFQoJGhhdmVfbWJzdGF0ZV90KQogIGlmIHRlc3QgeCIkaGF2ZV9tYnN0YXRlX3QiID0geHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfTUJTVEFURV9ULDEsW0RlZmluZSBpZiBtYnN0YXRlX3QgZXhpc3RzIGluIHdjaGFyLmguXSkKICBmaQoKICAjIFRlc3QgaXQgYWx3YXlzLCBmb3IgdXNlIGluIEdMSUJDWFhfRU5BQkxFX0M5OSwgdG9nZXRoZXIgd2l0aAogICMgYWNfaGFzX3djaGFyX2guCiAgQUNfQ0hFQ0tfSEVBREVSUyh3Y3R5cGUuaCwgYWNfaGFzX3djdHlwZV9oPXllcywgYWNfaGFzX3djdHlwZV9oPW5vKQogIAogIGlmIHRlc3QgeCIkZW5hYmxlX3djaGFyX3QiID0geCJ5ZXMiOyB0aGVuCgogICAgQUNfTEFOR19TQVZFCiAgICBBQ19MQU5HX0NQTFVTUExVUwogICAgCiAgICBpZiB0ZXN0IHgiJGFjX2hhc193Y2hhcl9oIiA9IHh5ZXMgJiYKICAgICAgIHRlc3QgeCIkYWNfaGFzX3djdHlwZV9oIiA9IHh5ZXM7IHRoZW4KICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGRlZi5oPgogICAgICAgICAgICAgICAgICAgICAgd2ludF90IGk7CgkJICAgICAgbG9uZyBsID0gV0VPRjsKCQkgICAgICBsb25nIGogPSBXQ0hBUl9NSU47CgkJICAgICAgbG9uZyBrID0gV0NIQVJfTUFYOwogICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHRlc3QKICAgICAgICAgICAgICAgICAgICAgIHsKCQkJdXNpbmcgOjpidG93YzsKCQkJdXNpbmcgOjpmZ2V0d2M7CgkJCXVzaW5nIDo6ZmdldHdzOwoJCQl1c2luZyA6OmZwdXR3YzsKCQkJdXNpbmcgOjpmcHV0d3M7CgkJCXVzaW5nIDo6ZndpZGU7CgkJCXVzaW5nIDo6ZndwcmludGY7IAoJCQl1c2luZyA6OmZ3c2NhbmY7CgkJCXVzaW5nIDo6Z2V0d2M7CgkJCXVzaW5nIDo6Z2V0d2NoYXI7CiAJCQl1c2luZyA6Om1icmxlbjsgCgkJCXVzaW5nIDo6bWJydG93YzsgCgkJCXVzaW5nIDo6bWJzaW5pdDsgCgkJCXVzaW5nIDo6bWJzcnRvd2NzOyAKCQkJdXNpbmcgOjpwdXR3YzsKCQkJdXNpbmcgOjpwdXR3Y2hhcjsKCQkJdXNpbmcgOjpzd3ByaW50ZjsgCgkJCXVzaW5nIDo6c3dzY2FuZjsgCgkJCXVzaW5nIDo6dW5nZXR3YzsKCQkJdXNpbmcgOjp2ZndwcmludGY7IAoJCQl1c2luZyA6OnZzd3ByaW50ZjsgCgkJCXVzaW5nIDo6dndwcmludGY7IAoJCQl1c2luZyA6OndjcnRvbWI7IAoJCQl1c2luZyA6Ondjc2NhdDsgCgkJCXVzaW5nIDo6d2NzY2hyOyAKCQkJdXNpbmcgOjp3Y3NjbXA7IAoJCQl1c2luZyA6Ondjc2NvbGw7IAoJCQl1c2luZyA6Ondjc2NweTsgCgkJCXVzaW5nIDo6d2NzY3NwbjsgCgkJCXVzaW5nIDo6d2NzZnRpbWU7IAoJCQl1c2luZyA6Ondjc2xlbjsKCQkJdXNpbmcgOjp3Y3NuY2F0OyAKCQkJdXNpbmcgOjp3Y3NuY21wOyAKCQkJdXNpbmcgOjp3Y3NuY3B5OyAKCQkJdXNpbmcgOjp3Y3NwYnJrOwoJCQl1c2luZyA6Ondjc3JjaHI7IAoJCQl1c2luZyA6Ondjc3J0b21iczsgCgkJCXVzaW5nIDo6d2Nzc3BuOyAKCQkJdXNpbmcgOjp3Y3NzdHI7CgkJCXVzaW5nIDo6d2NzdG9kOyAKCQkJdXNpbmcgOjp3Y3N0b2s7IAoJCQl1c2luZyA6Ondjc3RvbDsKCQkJdXNpbmcgOjp3Y3N0b3VsOyAKCQkJdXNpbmcgOjp3Y3N4ZnJtOyAKCQkJdXNpbmcgOjp3Y3RvYjsgCgkJCXVzaW5nIDo6d21lbWNocjsKCQkJdXNpbmcgOjp3bWVtY21wOwoJCQl1c2luZyA6OndtZW1jcHk7CgkJCXVzaW5nIDo6d21lbW1vdmU7CgkJCXVzaW5nIDo6d21lbXNldDsKCQkJdXNpbmcgOjp3cHJpbnRmOyAKCQkJdXNpbmcgOjp3c2NhbmY7IAoJCSAgICAgIH0KCQkgICAgIF0sW10sW10sIFtlbmFibGVfd2NoYXJfdD1ub10pCiAgICBlbHNlCiAgICAgIGVuYWJsZV93Y2hhcl90PW5vCiAgICBmaQoKICAgIEFDX0xBTkdfUkVTVE9SRQogIGZpCgogIGlmIHRlc3QgeCIkZW5hYmxlX3djaGFyX3QiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX1dDSEFSX1QsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciB3Y2hhcl90IHNob3VsZCBiZSB1c2VkLl0pCiAgZmkKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZW5hYmxlZCB3Y2hhcl90IHNwZWNpYWxpemF0aW9uc10pCiAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV93Y2hhcl90XSkKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiBidWlsZGluZyBhbmQgdXNpbmcgYSBDKysgcHJlY29tcGlsZWQgaGVhZGVyIGNhbiBiZSBkb25lLgpkbmwKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC1wY2g9eWVzCmRubCBkZWZhdWx0LCB0aGlzIHNob3dzIGludGVudCB0byB1c2Ugc3RkYysrLmguZ2NoIElmIGl0IGxvb2tzIGxpa2UgaXQKZG5sIG1heSB3b3JrLCBhZnRlciBzb21lIGxpZ2h0LWhlYXJ0ZWQgYXR0ZW1wdHMgdG8gcHV6emxlIG91dCBjb21waWxlcgpkbmwgc3VwcG9ydCwgZmxpcCBiaXRzIG9uIGluIGluY2x1ZGUvTWFrZWZpbGUuYW0KZG5sCmRubCAtLWRpc2FibGUtbGlic3RkY3h4LXBjaApkbmwgdHVybnMgb2ZmIGF0dGVtcHRzIHRvIHVzZSBvciBidWlsZCBzdGRjKysuaC5nY2guCmRubApkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfUENIRkxBR1MKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9QQ0hdLCBbCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LXBjaCwkMSwsW2J1aWxkIHByZS1jb21waWxlZCBsaWJzdGRjKysgaGVhZGVyc10pCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXM7IHRoZW4KICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgY29tcGlsZXIgd2l0aCBQQ0ggc3VwcG9ydF0sCiAgICAgIFtnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaF0sCiAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1XZXJyb3IgLVdpbnZhbGlkLXBjaCAtV25vLWRlcHJlY2F0ZWQiCiAgICAgICBBQ19MQU5HX1NBVkUKICAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCiAgICAgICBlY2hvICcjaW5jbHVkZSA8bWF0aC5oPicgPiBjb25mdGVzdC5oCiAgICAgICBpZiAkQ1hYICRDWFhGTEFHUyAkQ1BQRkxBR1MgLXggYysrLWhlYWRlciBjb25mdGVzdC5oIFwKCQkgICAgICAgICAgLW8gY29uZnRlc3QuaC5nY2ggMT4mNSAyPiYxICYmCgkgICAgICAgIGVjaG8gJyNlcnJvciAicGNoIGZhaWxlZCInID4gY29uZnRlc3QuaCAmJgogICAgICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0ZXN0LmgiJyA+IGNvbmZ0ZXN0LmNjICYmCgkgICAgICAgJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LmNjIDE+JjUgMj4mMSA7CiAgICAgICB0aGVuCiAgICAgICAgIGdsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoPXllcwogICAgICAgZWxzZQogICAgICAgICBnbGliY3h4X2N2X3Byb2dfQ1hYX3BjaD1ubwogICAgICAgZmkKICAgICAgIHJtIC1mIGNvbmZ0ZXN0KgogICAgICAgQ1hYRkxBR1M9JGFjX3NhdmVfQ1hYRkxBR1MKICAgICAgIEFDX0xBTkdfUkVTVE9SRQogICAgICBdKQogICAgZW5hYmxlX2xpYnN0ZGN4eF9wY2g9JGdsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoCiAgZmkKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZW5hYmxlZCBQQ0hdKQogIEFDX01TR19SRVNVTFQoWyRlbmFibGVfbGlic3RkY3h4X3BjaF0pCgogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9CVUlMRF9QQ0gsIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfcGNoID0geWVzKQogIGlmIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfcGNoID0geWVzOyB0aGVuCiAgICBnbGliY3h4X1BDSEZMQUdTPSItaW5jbHVkZSBiaXRzL3N0ZHRyMWMrKy5oIgogIGVsc2UKICAgIGdsaWJjeHhfUENIRkxBR1M9IiIKICBmaQogIEFDX1NVQlNUKGdsaWJjeHhfUENIRkxBR1MpCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgYXRvbWljIGJ1aWx0aW5zLgpkbmwgU2VlOgpkbmwgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0F0b21pYy1CdWlsdGlucy5odG1sI0F0b21pYy1CdWlsdGlucwpkbmwKZG5sIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgaG9zdCBzdXBwb3J0cyB0aGUgY29tcGlsZXItZ2VuZXJhdGVkCmRubCBidWlsdGlucyBmb3IgYXRvbWljIG9wZXJhdGlvbnMuIE5vdGUsIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYW4KZG5sIGFsbC1vci1ub3RoaW5nIHN3aXRjaCwgc28gYWxsIHRoZSBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IGFyZSB1c2VkCmRubCBzaG91bGQgYmUgY2hlY2tlZC4KZG5sCmRubCBOb3RlOgpkbmwgbGliZ29tcCBhbmQgbGliZ2ZvcnRyYW4gZG8gdGhpcyB3aXRoIGEgbGluayB0ZXN0LCBpbnN0ZWFkIG9mIGFuIGFzbSB0ZXN0Lgpkbmwgc2VlOiBDSEVDS19TWU5DX0ZFVENIX0FORF9BREQKZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUyBpZiB0aGUgY29tcGlsZXIgb24gdGhpcyB0YXJnZXQgc3VwcG9ydHMgYXRvbWljcy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9BVE9NSUNfQlVJTFRJTlNdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYXRvbWljIGJ1aWx0aW5zXSkKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICAjIEZha2Ugd2hhdCBBQ19UUllfQ09NUElMRSBkb2VzLiAgWFhYIExvb2sgYXQgcmVkb2luZyB0aGlzIG5ldy1zdHlsZS4KICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GClsjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCmludCBtYWluKCkKewogIC8vIE5COiBfQXRvbWljX3dvcmQgbm90IG5lY2Vzc2FyaWx5IGludC4gCiAgdHlwZWRlZiBpbnQgYXRvbWljX3R5cGU7CiAgYXRvbWljX3R5cGUgYzE7CiAgYXRvbWljX3R5cGUgYzI7CiAgY29uc3QgYXRvbWljX3R5cGUgYzMoMCk7CiAgaWYgKF9fc3luY19mZXRjaF9hbmRfYWRkKCZjMSwgYzIpID09IGMzKQogICAgewogICAgICAvLyBEbyBzb21ldGhpbmcuCiAgICB9CiAgIHJldHVybiAwOwp9CkVPRgogICAgb2xkX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgICBDWFhGTEFHUz0tUwogICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KICAgICAgaWYgZ3JlcCBfX3N5bmNfZmV0Y2hfYW5kX2FkZCBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgICAgICBlbmFibGVfYXRvbWljX2J1aWx0aW5zPW5vCiAgICAgIGVsc2UKICAgICAgQUNfREVGSU5FKF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUywgMSwKICAgICAgICBbRGVmaW5lIGlmIGJ1aWx0aW4gYXRvbWljIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuXSkKICAgICAgICBlbmFibGVfYXRvbWljX2J1aWx0aW5zPXllcwoJYXRvbWljaXR5X2Rpcj1jcHUvZ2VuZXJpYy9hdG9taWNpdHlfYnVpbHRpbnMKICAgICAgZmkKICAgIGZpCiAgICBDWFhGTEFHUz0iJG9sZF9DWFhGTEFHUyIKICAgIHJtIC1mIGNvbmZ0ZXN0KgoKICAgIyBOb3csIGlmIHN0aWxsIGdlbmVyaWMsIHNldCB0byBtdXRleC4KICBpZiB0ZXN0ICRhdG9taWNpdHlfZGlyID0gImNwdS9nZW5lcmljIiA7IHRoZW4KCWF0b21pY2l0eV9kaXI9Y3B1L2dlbmVyaWMvYXRvbWljaXR5X211dGV4CiAgZmkKIEFDX0xBTkdfUkVTVE9SRQogQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2F0b21pY19idWlsdGlucykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIElmIGFuIGV4cGxpY2l0IGVuYWJsZS9kaXNhYmxlCmRubCBzamxqIGV4Y2VwdGlvbnMgaXMgZ2l2ZW4sIHdlIGRvbid0IGhhdmUgdG8gZGV0ZWN0LiAgT3RoZXJ3aXNlIHRoZQpkbmwgdGFyZ2V0IG1heSBvciBtYXkgbm90IHN1cHBvcnQgY2FsbCBmcmFtZSBleGNlcHRpb25zLgpkbmwKZG5sIC0tZW5hYmxlLXNqbGotZXhjZXB0aW9ucyBmb3JjZXMgdGhlIHVzZSBvZiBidWlsdGluIHNldGptcC4KZG5sIC0tZGlzYWJsZS1zamxqLWV4Y2VwdGlvbnMgZm9yY2VzIHRoZSB1c2Ugb2YgY2FsbCBmcmFtZSB1bndpbmRpbmcuCmRubCBOZWl0aGVyIG9uZSBmb3JjZXMgYW4gYXR0ZW1wdCBhdCBkZXRlY3Rpb24uCmRubApkbmwgRGVmaW5lczoKZG5sICBfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIGl0CmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfU0pMSl9FWENFUFRJT05TXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGV4Y2VwdGlvbiBtb2RlbCB0byB1c2VdKQogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgR0xJQkNYWF9FTkFCTEUoc2psai1leGNlcHRpb25zLGF1dG8sLAogICAgW2ZvcmNlIHVzZSBvZiBidWlsdGluX3NldGptcCBmb3IgZXhjZXB0aW9uc10sCiAgICBbcGVybWl0IHllc3xub3xhdXRvXSkKCiAgaWYgdGVzdCAkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyA9IGF1dG87IHRoZW4KICAgICMgQm90aGVyYXRpb24uICBOb3cgd2UndmUgZ290IHRvIGRldGVjdCB0aGUgZXhjZXB0aW9uIG1vZGVsLiAgTGluayB0ZXN0cwogICAgIyBhZ2FpbnN0IGxpYmdjYy5hIGFyZSBwcm9ibGVtYXRpYyBzaW5jZSB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBwcm9wZXIgLUwKICAgICMgYml0cyBmb3Igc2luZ2xlLXRyZWUgbmV3bGliIGFuZCBsaWJnbG9zcy4KICAgICMKICAgICMgRmFrZSB3aGF0IEFDX1RSWV9DT01QSUxFIGRvZXMuICBYWFggTG9vayBhdCByZWRvaW5nIHRoaXMgbmV3LXN0eWxlLgogICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKc3RydWN0IFMgeyB+UygpOyB9Owp2b2lkIGJhcigpOwp2b2lkIGZvbygpCnsKICBTIHM7CiAgYmFyKCk7Cn0KRU9GCiAgICBvbGRfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICAgIENYWEZMQUdTPS1TCiAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgogICAgICBpZiBncmVwIF9VbndpbmRfU2pMal9SZXN1bWUgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX3NqbGpfZXhjZXB0aW9ucz15ZXMKICAgICAgZWxpZiBncmVwIF9VbndpbmRfUmVzdW1lIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgZWxpZiBncmVwIF9fY3hhX2VuZF9jbGVhbnVwIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgI0xMVk0gTE9DQUwgYmVnaW4KICAgICAgZWxpZiBncmVwIF9fY3hhX2VuZF9jbGVhbnVwIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgI0xMVk0gTE9DQUwgZW5kCiAgICAgIGZpCiAgICBmaQogICAgIyBMTFZNIExPQ0FMIEhBQ0shCiAgICBlbmFibGVfc2psal9leGNlcHRpb25zPW5vCiAgICBDWFhGTEFHUz0iJG9sZF9DWFhGTEFHUyIKICAgIHJtIC1mIGNvbmZ0ZXN0KgogIGZpCgogICMgVGhpcyBpcyBhIHRhZCB3ZWlyZCwgZm9yIGh5c3RlcmljYWwgcmFpc2lucy4gIFdlIGhhdmUgdG8gbWFwCiAgIyBlbmFibGUvZGlzYWJsZSB0byB0d28gZGlmZmVyZW50IG1vZGVscy4KICBjYXNlICRlbmFibGVfc2psal9leGNlcHRpb25zIGluCiAgICB5ZXMpCiAgICAgIEFDX0RFRklORShfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMsIDEsCiAgICAgICAgW0RlZmluZSBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmlndXJlZCBmb3Igc2V0am1wL2xvbmdqbXAgZXhjZXB0aW9ucy5dKQogICAgICBhY19leGNlcHRpb25fbW9kZWxfbmFtZT1zamxqCiAgICAgIDs7CiAgICBubykKICAgICAgYWNfZXhjZXB0aW9uX21vZGVsX25hbWU9ImNhbGwgZnJhbWUiCiAgICAgIDs7CiAgICAqKQogICAgICBBQ19NU0dfRVJST1IoW3VuYWJsZSB0byBkZXRlY3QgZXhjZXB0aW9uIG1vZGVsXSkKICAgICAgOzsKICBlc2FjCiBBQ19MQU5HX1JFU1RPUkUKIEFDX01TR19SRVNVTFQoJGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lKQpdKQoKCmRubApkbmwgQWxsb3cgdmlzaWJpbGl0eSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgb24gbmFtZXNwYWNlcywgb2JqZWN0cywgZXRjLgpkbmwKZG5sIC0tZW5hYmxlLXZpc2liaWxpdHkgZW5hYmxlcyBhdHRlbXB0IHRvIHVzZSB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCmRubCAtLWRpc2FibGUtdmlzaWJpbGl0eSB0dXJucyBvZmYgYWxsIHVzZSBvZiB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9WSVNJQklMSVRZWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgJ3llcycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfVklTSUJJTElUWV0sIFsKR0xJQkNYWF9FTkFCTEUodmlzaWJpbGl0eSwkMSwsW2VuYWJsZXMgdmlzaWJpbGl0eSBzYWZlIHVzYWdlXSkKCmlmIHRlc3QgeCRlbmFibGVfdmlzaWJpbGl0eSA9IHh5ZXMgOyB0aGVuCiAgZG5sIGFsbCBoYWlsIGxpYmdmb3J0cmFuCiAgZG5sIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBoaWRkZW4gdmlzaWJpbGl0eS4KICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGhpZGRlbiB2aXNpYmlsaXR5XSwKCQkgaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eSwgWwogIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgogIEFDX1RSWV9DT01QSUxFKFt2b2lkIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkgZm9vKHZvaWQpIHsgfV0sCgkJIFtdLCBoYXZlX2F0dHJpYnV0ZV92aXNpYmlsaXR5PXllcywKCQkgaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eT1ubykKICBDRkxBR1M9IiRzYXZlX0NGTEFHUyJdKQogIGlmIHRlc3QgJGhhdmVfYXR0cmlidXRlX3Zpc2liaWxpdHkgPSBubzsgdGhlbgogICAgZW5hYmxlX3Zpc2liaWxpdHk9bm8KICBmaQpmaQoKR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfVklTSUJJTElUWSwgdGVzdCAkZW5hYmxlX3Zpc2liaWxpdHkgPSB5ZXMpCkFDX01TR19OT1RJQ0UoW3Zpc2liaWxpdHkgc3VwcG9ydGVkOiAkZW5hYmxlX3Zpc2liaWxpdHldKQpdKQoKCmRubApkbmwgQWRkIHZlcnNpb24gdGFncyB0byBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJ5IChvciBub3QpLCBhZGRpdGlvbmFsbHkKZG5sIG1hcmtpbmcgb3RoZXIgc3ltYm9scyBhcyBwcml2YXRlL2xvY2FsIChvciBub3QpLgpkbmwKZG5sIC0tZW5hYmxlLXN5bXZlcnM9c3R5bGUgYWRkcyBhIHZlcnNpb24gc2NyaXB0IHRvIHRoZSBsaW5rZXIgY2FsbCB3aGVuCmRubCAgICAgICBjcmVhdGluZyB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGUgY2hvaWNlIG9mIHZlcnNpb24gc2NyaXB0IGlzCmRubCAgICAgICBjb250cm9sbGVkIGJ5ICdzdHlsZScuCmRubCAtLWRpc2FibGUtc3ltdmVycyBkb2VzIG5vdC4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX1NZTVZFUlNbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgJ3llcycgb3IgJ25vJy4gIFBhc3NpbmcgYHllcycgdHJpZXMgdG8KZG5sICAgICAgIGNob29zZSBhIGRlZmF1bHQgc3R5bGUgYmFzZWQgb24gbGlua2VyIGNoYXJhY3RlcmlzdGljcy4gIFBhc3NpbmcKZG5sICAgICAgICdubycgZGlzYWJsZXMgdmVyc2lvbmluZy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9TWU1WRVJTXSwgWwoKR0xJQkNYWF9FTkFCTEUoc3ltdmVycywkMSxbPVNUWUxFXSwKICBbZW5hYmxlcyBzeW1ib2wgdmVyc2lvbmluZyBvZiB0aGUgc2hhcmVkIGxpYnJhcnldLAogIFtwZXJtaXQgeWVzfG5vfGdudXxnbnUtdmVyc2lvbmVkLW5hbWVzcGFjZXxkYXJ3aW58ZGFyd2luLWV4cG9ydF0pCgojIElmIHdlIG5ldmVyIHdlbnQgdGhyb3VnaCB0aGUgR0xJQkNYWF9DSEVDS19MSU5LRVJfRkVBVFVSRVMgbWFjcm8sIHRoZW4gd2UKIyBkb24ndCBrbm93IGVub3VnaCBhYm91dCAkTEQgdG8gZG8gdHJpY2tzLi4uCkFDX1JFUVVJUkUoW0dMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTXSkKCiMgVHVybiBhICd5ZXMnIGludG8gYSBzdWl0YWJsZSBkZWZhdWx0LgppZiB0ZXN0IHgkZW5hYmxlX3N5bXZlcnMgPSB4eWVzIDsgdGhlbgogIGlmIHRlc3QgJGVuYWJsZV9zaGFyZWQgPSBubyB8fCB0ZXN0ICJ4JExEIiA9IHggfHwgdGVzdCB4JGdjY19ub19saW5rID0geHllczsgdGhlbgogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBlbHNlCiAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IHllcyA7IHRoZW4KICAgICAgZW5hYmxlX3N5bXZlcnM9Z251CiAgICBlbHNlCiAgICAgIGNhc2UgJHt0YXJnZXRfb3N9IGluCiAgICAgICAgZGFyd2luKikKCSAgZW5hYmxlX3N5bXZlcnM9ZGFyd2luIDs7CiAgICAgICAgKikKICAgICAgICAgIGVuYWJsZV9zeW12ZXJzPW5vIDs7CiAgICAgIGVzYWMKICAgIGZpCiAgZmkKZmkKCiMgQ2hlY2sgdG8gc2VlIGlmICdkYXJ3aW4nIG9yICdkYXJ3aW4tZXhwb3J0JyBjYW4gd2luLgppZiB0ZXN0IHgkZW5hYmxlX3N5bXZlcnMgPSB4ZGFyd2luLWV4cG9ydCA7IHRoZW4KICAgIGVuYWJsZV9zeW12ZXJzPWRhcndpbgpmaQoKIyBDaGVjayB0byBzZWUgaWYgJ2dudScgY2FuIHdpbi4KaWYgdGVzdCAkZW5hYmxlX3N5bXZlcnMgPSBnbnUgfHwgdGVzdCAkZW5hYmxlX3N5bXZlcnMgPSBnbnUtdmVyc2lvbmVkLW5hbWVzcGFjZTsgdGhlbgogICMgQ2hlY2sgdG8gc2VlIGlmIGxpYmdjY19zIGV4aXN0cywgaW5kaWNhdGluZyB0aGF0IHNoYXJlZCBsaWJnY2MgaXMgcG9zc2libGUuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc2hhcmVkIGxpYmdjY10pCiAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgQ0ZMQUdTPScgLWxnY2NfcycKICBBQ19UUllfTElOSygsIFtyZXR1cm4gMDtdLCBnbGliY3h4X3NoYXJlZF9saWJnY2M9eWVzLCBnbGliY3h4X3NoYXJlZF9saWJnY2M9bm8pCiAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgaWYgdGVzdCAkZ2xpYmN4eF9zaGFyZWRfbGliZ2NjID0gbm87IHRoZW4KICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKaW50IG1haW4gKHZvaWQpIHsgcmV0dXJuIDA7IH0KRU9GCmNoYW5nZXF1b3RlKCwpZG5sCiAgICBnbGliY3h4X2xpYmdjY19zX3N1ZmZpeD1gJHtDQy1jY30gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgXAoJCQkgICAgIC1zaGFyZWQgLXNoYXJlZC1saWJnY2MgLW8gY29uZnRlc3Quc28gXAoJCQkgICAgIGNvbmZ0ZXN0LmMgLXYgMj4mMSA+L2Rldi9udWxsIFwKCQkJICAgICB8IHNlZCAtbiAncy9eLiogLWxnY2Nfc1woW14gXSpcKSAuKiQvXDEvcCdgCmNoYW5nZXF1b3RlKFssXSlkbmwKICAgIHJtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Quc28KICAgIGlmIHRlc3QgeCR7Z2xpYmN4eF9saWJnY2Nfc19zdWZmaXgrc2V0fSA9IHhzZXQ7IHRoZW4KICAgICAgQ0ZMQUdTPSIgLWxnY2NfcyRnbGliY3h4X2xpYmdjY19zX3N1ZmZpeCIKICAgICAgQUNfVFJZX0xJTksoLCBbcmV0dXJuIDA7XSwgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPXllcykKICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgICBmaQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9zaGFyZWRfbGliZ2NjKQoKICAjIEZvciBHTlUgbGQsIHdlIG5lZWQgYXQgbGVhc3QgdGhpcyB2ZXJzaW9uLiAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4KICAjIEdMSUJDWFhfQ0hFQ0tfTElOS0VSX0ZFQVRVUkVTIGFib3ZlLgogIGdsaWJjeHhfbWluX2dudV9sZF92ZXJzaW9uPTIxNDAwCgogICMgSWYgbm8gc2hhcmVkIGxpYmdjYywgY2FuJ3Qgd2luLgogIGlmIHRlc3QgJGdsaWJjeHhfc2hhcmVkX2xpYmdjYyAhPSB5ZXM7IHRoZW4KICAgICAgQUNfTVNHX1dBUk4oWz09PSBZb3UgaGF2ZSByZXF1ZXN0ZWQgR05VIHN5bWJvbCB2ZXJzaW9uaW5nLCBidXRdKQogICAgICBBQ19NU0dfV0FSTihbPT09IHlvdSBhcmUgbm90IGJ1aWxkaW5nIGEgc2hhcmVkIGxpYmdjY19zLl0pCiAgICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgICBlbmFibGVfc3ltdmVycz1ubwogIGVsaWYgdGVzdCAkd2l0aF9nbnVfbGQgIT0geWVzIDsgdGhlbgogICAgIyBqdXN0IGZhaWwgZm9yIG5vdwogICAgQUNfTVNHX1dBUk4oWz09PSBZb3UgaGF2ZSByZXF1ZXN0ZWQgR05VIHN5bWJvbCB2ZXJzaW9uaW5nLCBidXRdKQogICAgQUNfTVNHX1dBUk4oWz09PSB5b3UgYXJlIG5vdCB1c2luZyB0aGUgR05VIGxpbmtlci5dKQogICAgQUNfTVNHX1dBUk4oWz09PSBTeW1ib2wgdmVyc2lvbmluZyB3aWxsIGJlIGRpc2FibGVkLl0pCiAgICBlbmFibGVfc3ltdmVycz1ubwogIGVsaWYgdGVzdCAkZ2xpYmN4eF9nbnVfbGRfdmVyc2lvbiAtbHQgJGdsaWJjeHhfbWluX2dudV9sZF92ZXJzaW9uIDsgdGhlbgogICAgIyBUaGUgcmlnaHQgdG9vbHMsIHRoZSByaWdodCBzZXR1cCwgYnV0IHRvbyBvbGQuICBGYWxsYmFja3M/CiAgICBBQ19NU0dfV0FSTig9PT0gTGlua2VyIHZlcnNpb24gJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gaXMgdG9vIG9sZCBmb3IpCiAgICBBQ19NU0dfV0FSTig9PT0gZnVsbCBzeW1ib2wgdmVyc2lvbmluZyBzdXBwb3J0IGluIHRoaXMgcmVsZWFzZSBvZiBHQ0MuKQogICAgQUNfTVNHX1dBUk4oPT09IFlvdSB3b3VsZCBuZWVkIHRvIHVwZ3JhZGUgeW91ciBiaW51dGlscyB0byB2ZXJzaW9uKQogICAgQUNfTVNHX1dBUk4oPT09ICRnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbiBvciBsYXRlciBhbmQgcmVidWlsZCBHQ0MuKQogICAgQUNfTVNHX1dBUk4oWz09PSBTeW1ib2wgdmVyc2lvbmluZyB3aWxsIGJlIGRpc2FibGVkLl0pCiAgICBlbmFibGVfc3ltdmVycz1ubwogIGZpCmZpCgojIEV2ZXJ5dGhpbmcgcGFyc2VkOyBmaWd1cmUgb3V0IHdoYXQgZmlsZSB0byB1c2UuCmNhc2UgJGVuYWJsZV9zeW12ZXJzIGluCiAgbm8pCiAgICBTWU1WRVJfRklMRT1jb25maWcvYWJpL3ByZS9ub25lLnZlcgogICAgOzsKICBnbnUpCiAgICBTWU1WRVJfRklMRT1jb25maWcvYWJpL3ByZS9nbnUudmVyCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfU1lNVkVSX0dOVSwgMSwgCiAgICAgICAgICAgICAgW0RlZmluZSB0byB1c2UgR05VIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ll0pCiAgICA7OwogIGdudS12ZXJzaW9uZWQtbmFtZXNwYWNlKQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvZ251LXZlcnNpb25lZC1uYW1lc3BhY2UudmVyCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfU1lNVkVSX0dOVV9OQU1FU1BBQ0UsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIEdOVSBuYW1lc3BhY2UgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuXSkKICAgIDs7CiAgZGFyd2luKQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvZ251LnZlcgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUl9EQVJXSU4sIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIGRhcndpbiB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS5dKQogICAgOzsKZXNhYwoKaWYgdGVzdCB4JGVuYWJsZV9zeW12ZXJzICE9IHhubyA7IHRoZW4KICBBQ19ERUZJTkUoX0dMSUJDWFhfU1lNVkVSLCAxLAoJIFtEZWZpbmUgdG8gdXNlIHN5bWJvbCB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS5dKQpmaQoKQUNfU1VCU1QoU1lNVkVSX0ZJTEUpCkFDX1NVQlNUKHBvcnRfc3BlY2lmaWNfc3ltYm9sX2ZpbGVzKQpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9TWU1WRVJTLCB0ZXN0ICRlbmFibGVfc3ltdmVycyAhPSBubykKR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfU1lNVkVSU19HTlUsIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251KQpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9TWU1WRVJTX0dOVV9OQU1FU1BBQ0UsIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251LXZlcnNpb25lZC1uYW1lc3BhY2UpCkdMSUJDWFhfQ09ORElUSU9OQUwoRU5BQkxFX1NZTVZFUlNfREFSV0lOLCB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IGRhcndpbikKQUNfTVNHX05PVElDRSh2ZXJzaW9uaW5nIG9uIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgaXMgJGVuYWJsZV9zeW12ZXJzKQoKIyBOb3csIHNldCB1cCBjb21wYXRpYmlsaXR5IHN1cHBvcnQsIGlmIGFueS4KIyBJbiBhZGRpdGlvbiwgbmVlZCB0aGlzIHRvIGRlYWwgd2l0aCBzdGQ6OnNpemVfdCBtYW5nbGluZyBpbgojIHNyYy9jb21wYXRpYmlsaXR5LmNjLiAgSW4gYSBwZXJmZWN0IHdvcmxkLCBjb3VsZCB1c2UKIyB0eXBlaWQoc3RkOjpzaXplX3QpLm5hbWUoKVswXSB0byBkbyBkaXJlY3Qgc3Vic3RpdHV0aW9uLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaXplX3QgYXMgdW5zaWduZWQgaW50XSkKYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCkNGTEFHUz0iLVdlcnJvciIKQUNfVFJZX0NPTVBJTEUoLCBbX19TSVpFX1RZUEVfXyogc3RwOyB1bnNpZ25lZCBpbnQqIHVpcDsgc3RwID0gdWlwO10sIAoJICAgICAgICAgW2dsaWJjeHhfc2l6ZV90X2lzX2k9eWVzXSwgW2dsaWJjeHhfc2l6ZV90X2lzX2k9bm9dKQpDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCmlmIHRlc3QgIiRnbGliY3h4X3NpemVfdF9pc19pIiA9IHllczsgdGhlbgogIEFDX0RFRklORShfR0xJQkNYWF9TSVpFX1RfSVNfVUlOVCwgMSwgW0RlZmluZSBpZiBzaXplX3QgaXMgdW5zaWduZWQgaW50Ll0pCmZpCkFDX01TR19SRVNVTFQoWyRnbGliY3h4X3NpemVfdF9pc19pXSkKCkFDX01TR19DSEVDS0lORyhbZm9yIHB0cmRpZmZfdCBhcyBpbnRdKQphY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKQ0ZMQUdTPSItV2Vycm9yIgpBQ19UUllfQ09NUElMRSgsIFtfX1BUUkRJRkZfVFlQRV9fKiBwdHA7IGludCogaXA7IHB0cCA9IGlwO10sIAoJICAgICAgICAgW2dsaWJjeHhfcHRyZGlmZl90X2lzX2k9eWVzXSwgW2dsaWJjeHhfcHRyZGlmZl90X2lzX2k9bm9dKQpDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCmlmIHRlc3QgIiRnbGliY3h4X3B0cmRpZmZfdF9pc19pIiA9IHllczsgdGhlbgogIEFDX0RFRklORShfR0xJQkNYWF9QVFJESUZGX1RfSVNfSU5ULCAxLCBbRGVmaW5lIGlmIHB0cmRpZmZfdCBpcyBpbnQuXSkKZmkKQUNfTVNHX1JFU1VMVChbJGdsaWJjeHhfcHRyZGlmZl90X2lzX2ldKQpdKQoKCmRubApkbmwgU2V0dXAgdG8gdXNlIHRoZSBnY2MgZ3Roci5oIHRocmVhZC1zcGVjaWZpYyBtZW1vcnkgYW5kIG11dGV4IG1vZGVsLgpkbmwgV2UgbXVzdCBzdGFnZSB0aGUgcmVxdWlyZWQgaGVhZGVycyBzbyB0aGF0IHRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKZG5sIHdpdGggdGhlIGxpYnJhcnkgKHVubGlrZSBsaWJnY2MsIHRoZSBTVEwgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKZG5sIHNvbGVseSB3aXRoaW4gaGVhZGVycykuICBTaW5jZSB3ZSBtdXN0IG5vdCBpbmplY3QgcmFuZG9tIHVzZXItc3BhY2UKZG5sIG1hY3JvIG5hbWVzIGludG8gdXNlci1wcm92aWRlZCBDKysgY29kZSwgd2UgZmlyc3Qgc3RhZ2UgaW50byA8ZmlsZT4taW4KZG5sIGFuZCBwcm9jZXNzIHRvIDxmaWxlPiB3aXRoIGFuIG91dHB1dCBjb21tYW5kLiAgVGhlIHJlYXNvbiBmb3IgYSB0d28tCmRubCBzdGFnZSBwcm9jZXNzIGhlcmUgaXMgdG8gY29ycmVjdGx5IGhhbmRsZSAkc3JjZGlyIT0kb2JqZGlyIHdpdGhvdXQKZG5sIGhhdmluZyB0byB3cml0ZSBjb21wbGV4IGNvZGUgKHRoZSBzZWQgY29tbWFuZHMgdG8gY2xlYW4gdGhlIG1hY3JvCmRubCBuYW1lc3BhY2UgYXJlIGNvbXBsZXggYW5kIGZyYWdpbGUgZW5vdWdoIGFzIGl0IGlzKS4gIFdlIG11c3QgYWxzbwpkbmwgYWRkIGEgcmVsYXRpdmUgcGF0aCBzbyB0aGF0IC1JLSBpcyBzdXBwb3J0ZWQgcHJvcGVybHkuCmRubApkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfdGhyZWFkX2gKZG5sCmRubCBEZWZpbmVzOgpkbmwgIEhBVkVfR1RIUl9ERUZBVUxUCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfVEhSRUFEU10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aHJlYWQgbW9kZWwgdXNlZCBieSBHQ0NdKQogIHRhcmdldF90aHJlYWRfZmlsZT1gJENYWCAtdiAyPiYxIHwgc2VkIC1uICdzL15UaHJlYWQgbW9kZWw6IC8vcCdgCiAgQUNfTVNHX1JFU1VMVChbJHRhcmdldF90aHJlYWRfZmlsZV0pCgogIGlmIHRlc3QgJHRhcmdldF90aHJlYWRfZmlsZSAhPSBzaW5nbGU7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX0dUSFJfREVGQVVMVCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGd0aHItZGVmYXVsdC5oIGV4aXN0cyAKICAgICAgICAgICAgICAobWVhbmluZyB0aGF0IHRocmVhZGluZyBzdXBwb3J0IGlzIGVuYWJsZWQpLl0pCiAgZmkKCiAgZ2xpYmN4eF90aHJlYWRfaD1ndGhyLSR0YXJnZXRfdGhyZWFkX2ZpbGUuaAoKICBkbmwgQ2hlY2sgZm9yIF9fR1RIUkVBRFMgZGVmaW5lLgogIGd0aHJlYWRfZmlsZT0ke3RvcGxldmVsX3NyY2Rpcn0vZ2NjLyR7Z2xpYmN4eF90aHJlYWRfaH0KICBpZiBncmVwIF9fR1RIUkVBRFMgJGd0aHJlYWRfZmlsZSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICBlbmFibGVfdGhyZWFkPXllcwogIGVsc2UKICAgZW5hYmxlX3RocmVhZD1ubwogIGZpCgogIEFDX1NVQlNUKGdsaWJjeHhfdGhyZWFkX2gpCl0pCgoKIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgojIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgojCiMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgojIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQojIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCiMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KCiMgc2VyaWFsIDEKQUNfREVGVU4oW0FDX0xDX01FU1NBR0VTXSwgWwogIEFDX0NIRUNLX0hFQURFUihsb2NhbGUuaCwgWwogICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFjX2N2X3ZhbF9MQ19NRVNTQUdFUywKICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCiAgICAgICBhY19jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhY19jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKICAgIGlmIHRlc3QgJGFjX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgogICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwgCiAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+Ll0pCiAgICBmaQogIF0pCl0pCgojIE1hY3JvcyBmcm9tIHRoZSB0b3AtbGV2ZWwgZ2NjIGRpcmVjdG9yeS4KbTRfaW5jbHVkZShbLi4vY29uZmlnL3Rscy5tNF0pCgo=