IyBDb3B5cmlnaHQgKGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQojIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAojIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQojIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKIyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiMgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCiMgVkEtQVBJIHZlcnNpb24KIyAtIGluY3JlbWVudCBtYWpvciBmb3IgYW55IEFCSSBjaGFuZ2UgKHdoaWNoIHNoYWxsIG5vdCBvY2N1ciEpCiMgLSBpbmNyZW1lbnQgbWlub3IgZm9yIGFueSBpbnRlcmZhY2UgY2hhbmdlIChlLmcuIG5ldy9tb2RpZmllZCBmdW5jdGlvbikKIyAtIGluY3JlbWVudCBtaWNybyBmb3IgYW55IG90aGVyIGNoYW5nZSAobmV3IGZsYWcsIG5ldyBjb2RlYyBkZWZpbml0aW9uLCBldGMuKQojIC0gcmVzZXQgbWljcm8gdmVyc2lvbiB0byB6ZXJvIHdoZW4gbWlub3IgdmVyc2lvbiBpcyBpbmNyZW1lbnRlZAojIC0gcmVzZXQgbWlub3IgdmVyc2lvbiB0byB6ZXJvIHdoZW4gbWFqb3IgdmVyc2lvbiBpcyBpbmNyZW1lbnRlZAptNF9kZWZpbmUoW3ZhX2FwaV9tYWpvcl92ZXJzaW9uXSwgWzBdKQptNF9kZWZpbmUoW3ZhX2FwaV9taW5vcl92ZXJzaW9uXSwgWzMyXSkKbTRfZGVmaW5lKFt2YV9hcGlfbWljcm9fdmVyc2lvbl0sIFsxXSkKCm00X2RlZmluZShbdmFfYXBpX3ZlcnNpb25dLAogICAgICAgICAgW3ZhX2FwaV9tYWpvcl92ZXJzaW9uLnZhX2FwaV9taW5vcl92ZXJzaW9uLnZhX2FwaV9taWNyb192ZXJzaW9uXSkKCiMgbGlidmEgcGFja2FnZSB2ZXJzaW9uIG51bWJlciwgKGFzIGRpc3RpbmN0IGZyb20gc2hhcmVkIGxpYnJhcnkgdmVyc2lvbikKIyBYWFg6IHdlIHdhbnQgdGhlIHBhY2thZ2UgdmVyc2lvbiB0byByZW1haW4gYXQgMS4wLnggZm9yIFZBLUFQSSAwLjMyLnkKIwojIC0gbWFqb3IgdmVyc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIFZBLUFQSSBtYWpvciB2ZXJzaW9uCiMgLSBtaW5vciB2ZXJzaW9uIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gVkEtQVBJIG1pbm9yIHZlcnNpb24KIyAtIGluY3JlbWVudCBtaWNybyBmb3IgYW55IGxpYnJhcnkgcmVsZWFzZQojIC0gcmVzZXQgbWljcm8gdmVyc2lvbiB0byB6ZXJvIHdoZW4gVkEtQVBJIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gaXMgY2hhbmdlZAptNF9kZWZpbmUoW2xpYnZhX21ham9yX3ZlcnNpb25dLCBbbTRfZXZhbCh2YV9hcGlfbWFqb3JfdmVyc2lvbiArIDEpXSkKbTRfZGVmaW5lKFtsaWJ2YV9taW5vcl92ZXJzaW9uXSwgW200X2V2YWwodmFfYXBpX21pbm9yX3ZlcnNpb24gLSAzMildKQptNF9kZWZpbmUoW2xpYnZhX21pY3JvX3ZlcnNpb25dLCBbMTddKQptNF9kZWZpbmUoW2xpYnZhX3ByZV92ZXJzaW9uXSwgICBbMV0pCgptNF9kZWZpbmUoW2xpYnZhX3ZlcnNpb25dLAogICAgICAgICAgW2xpYnZhX21ham9yX3ZlcnNpb24ubGlidmFfbWlub3JfdmVyc2lvbi5saWJ2YV9taWNyb192ZXJzaW9uXSkKbTRfaWYobGlidmFfcHJlX3ZlcnNpb24sIFswXSwgW10sIFsKbTRfYXBwZW5kKFtsaWJ2YV92ZXJzaW9uXSwgbGlidmFfcHJlX3ZlcnNpb24sIFsucHJlXSkKXSkKCiMgbGlidmEgbGlicmFyeSB2ZXJzaW9uIG51bWJlciAoZ2VuZXJhdGVkLCBkbyBub3QgY2hhbmdlKQojIFhYWDogd2Ugd2FudCB0aGUgU09OQU1FIHRvIHJlbWFpbiBhdCBsaWJ2YS5zby4xIGZvciBWQS1BUEkgbWFqb3IgPT0gMAojCiMgVGhlIGxpYnJhcnkgbmFtZSBpcyBnZW5lcmF0ZWQgbGlidmEuPHg+Ljx5Pi4wIHdoZXJlCiMgPHg+ID0gVkEtQVBJIG1ham9yIHZlcnNpb24gKyAxCiMgPHk+ID0gMTAwICogVkEtQVBJIG1pbm9yIHZlcnNpb24gKyBWQS1BUEkgbWljcm8gdmVyc2lvbgojCiMgRm9yIGV4YW1wbGU6CiMgVkEtQVBJIDAuMzIuMCBnZW5lcmF0ZXMgbGlidmEuc28uMS4zMjAwLjAKIyBWQS1BUEkgMC4zNC4xIGdlbmVyYXRlcyBsaWJ2YS5zby4xLjM0MDEuMAojIFZBLUFQSSAxLjIuMTMgZ2VuZXJhdGVzIGxpYnZhLnNvLjIuMjEzLjAKbTRfZGVmaW5lKFtsaWJ2YV9pbnRlcmZhY2VfYmlhc10sIFttNF9ldmFsKHZhX2FwaV9tYWpvcl92ZXJzaW9uICsgMSldKQptNF9kZWZpbmUoW2xpYnZhX2ludGVyZmFjZV9hZ2VdLCAgWzBdKQptNF9kZWZpbmUoW2xpYnZhX2JpbmFyeV9hZ2VdLAogICAgICAgICAgW200X2V2YWwoMTAwICogdmFfYXBpX21pbm9yX3ZlcnNpb24gKyB2YV9hcGlfbWljcm9fdmVyc2lvbiAtIGxpYnZhX2ludGVyZmFjZV9hZ2UpXSkKCm00X2RlZmluZShbbGlidmFfbHRfY3VycmVudF0sCiAgICAgICAgICBbbTRfZXZhbCgxMDAgKiB2YV9hcGlfbWlub3JfdmVyc2lvbiArIHZhX2FwaV9taWNyb192ZXJzaW9uICsgbGlidmFfaW50ZXJmYWNlX2JpYXMpXSkKbTRfZGVmaW5lKFtsaWJ2YV9sdF9yZXZpc2lvbl0sCiAgICAgICAgICBbbTRfZXZhbChsaWJ2YV9pbnRlcmZhY2VfYWdlKV0pCm00X2RlZmluZShbbGlidmFfbHRfYWdlXSwKICAgICAgICAgIFttNF9ldmFsKGxpYnZhX2JpbmFyeV9hZ2UgLSBsaWJ2YV9pbnRlcmZhY2VfYWdlKV0pCgojIGxpYmRybSBtaW5pbXVuIHZlcnNpb24gcmVxdWlyZW1lbnQKbTRfZGVmaW5lKFtsaWJkcm1fdmVyc2lvbl0sIFsyLjRdKQoKQUNfUFJFUkVRKDIuNTcpCkFDX0lOSVQoW2xpYnZhXSwgW2xpYnZhX3ZlcnNpb25dLCBbd2FsZG8uYmFzdGlhbkBpbnRlbC5jb21dLCBsaWJ2YSkKQUNfQ09ORklHX1NSQ0RJUihbTWFrZWZpbGUuYW1dKQpBTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKCkFNX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkKbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sIFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSkKClZBX0FQSV9NQUpPUl9WRVJTSU9OPXZhX2FwaV9tYWpvcl92ZXJzaW9uClZBX0FQSV9NSU5PUl9WRVJTSU9OPXZhX2FwaV9taW5vcl92ZXJzaW9uClZBX0FQSV9NSUNST19WRVJTSU9OPXZhX2FwaV9taWNyb192ZXJzaW9uClZBX0FQSV9WRVJTSU9OPXZhX2FwaV92ZXJzaW9uCkFDX1NVQlNUKFZBX0FQSV9NQUpPUl9WRVJTSU9OKQpBQ19TVUJTVChWQV9BUElfTUlOT1JfVkVSU0lPTikKQUNfU1VCU1QoVkFfQVBJX01JQ1JPX1ZFUlNJT04pCkFDX1NVQlNUKFZBX0FQSV9WRVJTSU9OKQoKTElCVkFfTUFKT1JfVkVSU0lPTj1saWJ2YV9tYWpvcl92ZXJzaW9uCkxJQlZBX01JTk9SX1ZFUlNJT049bGlidmFfbWlub3JfdmVyc2lvbgpMSUJWQV9NSUNST19WRVJTSU9OPWxpYnZhX21pY3JvX3ZlcnNpb24KTElCVkFfVkVSU0lPTj1saWJ2YV92ZXJzaW9uCkFDX1NVQlNUKExJQlZBX01BSk9SX1ZFUlNJT04pCkFDX1NVQlNUKExJQlZBX01JTk9SX1ZFUlNJT04pCkFDX1NVQlNUKExJQlZBX01JQ1JPX1ZFUlNJT04pCkFDX1NVQlNUKExJQlZBX1ZFUlNJT04pCgpMSUJWQV9MVF9DVVJSRU5UPWxpYnZhX2x0X2N1cnJlbnQKTElCVkFfTFRfUkVWPWxpYnZhX2x0X3JldmlzaW9uCkxJQlZBX0xUX0FHRT1saWJ2YV9sdF9hZ2UKTElCVkFfTFRfVkVSU0lPTj0iJExJQlZBX0xUX0NVUlJFTlQ6JExJQlZBX0xUX1JFVjokTElCVkFfTFRfQUdFIgpMSUJWQV9MVF9MREZMQUdTPSItdmVyc2lvbi1pbmZvICRMSUJWQV9MVF9WRVJTSU9OIgpBQ19TVUJTVChMSUJWQV9MVF9WRVJTSU9OKQpBQ19TVUJTVChMSUJWQV9MVF9MREZMQUdTKQoKQUNfQVJHX0VOQUJMRShnbHgsCiAgICAgICAgICAgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nbHhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVpbGQgd2l0aCBPcGVuR0wgZm9yIFgxMSBzdXBwb3J0XSldLAogICAgICAgICAgICAgIFtdLCBbZW5hYmxlX2dseD15ZXNdKQoKQUNfQVJHX0VOQUJMRShkdW1teS1kcml2ZXIsCiAgICAgICAgICAgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kdW1teS1kcml2ZXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVpbGQgZHVtbXkgdmlkZW8gZHJpdmVyXSldLAogICAgICAgICAgICAgIFtdLCBbZW5hYmxlX2R1bW15X2RyaXZlcj15ZXNdKQpBTV9DT05ESVRJT05BTChCVUlMRF9EVU1NWV9EUklWRVIsIHRlc3QgeCRlbmFibGVfZHVtbXlfZHJpdmVyID0geHllcykKCkFDX0FSR19FTkFCTEUoZHVtbXktYmFja2VuZCwKICAgICAgICAgICAgICBbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWR1bW15LWJhY2tlbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVpbGQgZHVtbXkgbGlidmEgYmFja2VuZF0pXSwKICAgICAgICAgICAgICBbXSwgW2VuYWJsZV9kdW1teV9iYWNrZW5kPW5vXSkKCkFDX0FSR19XSVRIKGRyaXZlcnMtcGF0aCwKCSAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kcml2ZXJzLXBhdGg9W1twYXRoXV1dLCBbZHJpdmVycyBwYXRoXSldLCwKCSAgICBbd2l0aF9kcml2ZXJzX3BhdGg9IiRsaWJkaXIvZHJpIl0pCgpMSUJWQV9EUklWRVJTX1BBVEg9IiR3aXRoX2RyaXZlcnNfcGF0aCIKQUNfU1VCU1QoTElCVkFfRFJJVkVSU19QQVRIKQoKQUNfRElTQUJMRV9TVEFUSUMKQUNfUFJPR19MSUJUT09MCkFDX1BST0dfQ0MKQUNfUFJPR19DWFgKCkFDX0hFQURFUl9TVERDCkFDX1NZU19MQVJHRUZJTEUKClBLR19DSEVDS19NT0RVTEVTKFtYMTFdLCBbeDExXSkKUEtHX0NIRUNLX01PRFVMRVMoW1hFWFRdLFt4ZXh0XSkKUEtHX0NIRUNLX01PRFVMRVMoW1hGSVhFU10sIFt4Zml4ZXNdKQoKIyBDaGVjayBmb3IgcmVjZW50IGVub3VnaCBEUk0KTElCRFJNX1ZFUlNJT049bGliZHJtX3ZlcnNpb24KUEtHX0NIRUNLX01PRFVMRVMoW0RSTV0sIFtsaWJkcm0gPj0gJExJQkRSTV9WRVJTSU9OXSkKQUNfU1VCU1QoTElCRFJNX1ZFUlNJT04pCgppZiB0ZXN0IHgkZW5hYmxlX2R1bW15X2JhY2tlbmQgPSB4eWVzOyB0aGVuCiAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbVURFVl0sIFtsaWJ1ZGV2XSwgW2xpYnVkZXY9eWVzXSwgW2xpYnVkZXY9bm9dKQpmaQppZiB0ZXN0IHgkbGlidWRldiA9IHhubzsgdGhlbgogICBlbmFibGVfZHVtbXlfYmFja2VuZD1ubwpmaQpBTV9DT05ESVRJT05BTChCVUlMRF9EVU1NWV9CQUNLRU5ELCB0ZXN0IHgkZW5hYmxlX2R1bW15X2JhY2tlbmQgPSB4eWVzKQoKIyBDaGVjayBmb3IgT3BlbkdMIChYMTEpClVTRV9HTFg9Im5vIgpHTF9ERVBTX0NGTEFHUz0iIgpHTF9ERVBTX0xJQlM9IiIKaWYgdGVzdCB4JGVuYWJsZV9nbHggPSB4eWVzOyB0aGVuCiAgICBBQ19DSEVDS19IRUFERVJTKFtHTC9nbC5oXSkKICAgIEFDX0NIRUNLX0hFQURFUlMoW0dML2dseC5oXSkKICAgIEFDX0NIRUNLX0xJQihHTCwgZ2xYQ3JlYXRlQ29udGV4dCwgWwogICAgICAgIFVTRV9HTFg9InllcyIKICAgICAgICBHTF9ERVBTX0xJQlM9Ii1sWDExIC1sR0wiCiAgICBdKQpmaQpBQ19TVUJTVChHTF9ERVBTX0NGTEFHUykKQUNfU1VCU1QoR0xfREVQU19MSUJTKQpBTV9DT05ESVRJT05BTChVU0VfR0xYLCB0ZXN0ICIkVVNFX0dMWCIgPSAieWVzIikKCiMgVEJEOiBDaGVjayBmb3IgRUdMClVTRV9FR0w9InllcyIKQU1fQ09ORElUSU9OQUwoVVNFX0VHTCwgdGVzdCAiJFVTRV9FR0wiID0gInllcyIpCgojIFdlIG9ubHkgbmVlZCB0aGUgaGVhZGVycywgd2UgZG9uJ3QgbGluayBhZ2FpbnN0IHRoZSBEUk0gbGlicmFyaWVzCkxJQlZBX0NGTEFHUz0iJERSTV9DRkxBR1MiCkFDX1NVQlNUKExJQlZBX0NGTEFHUykKQUNfU1VCU1QoTElCVkFfTElCUykKCnBrZ2NvbmZpZ2Rpcj0ke2xpYmRpcn0vcGtnY29uZmlnCkFDX1NVQlNUKHBrZ2NvbmZpZ2RpcikKCkxJQlZBX0RJU1BMQVk9eDExCmxpYnZhY29yZWxpYj1saWJ2YS5sYQpsaWJ2YWJhY2tlbmRsaWI9bGlidmEtJExJQlZBX0RJU1BMQVkubGEKQUNfU1VCU1QoW2xpYnZhY29yZWxpYl0pCkFDX1NVQlNUKFtsaWJ2YWJhY2tlbmRsaWJdKQoKQUNfT1VUUFVUKFsKCU1ha2VmaWxlCglkZWJpYW4udXBzdHJlYW0vTWFrZWZpbGUKCXZhL01ha2VmaWxlCgl2YS92YV92ZXJzaW9uLmgKCXZhL3gxMS9NYWtlZmlsZQoJdmEvZ2x4L01ha2VmaWxlCgl2YS9lZ2wvTWFrZWZpbGUKCXZhL2R1bW15L01ha2VmaWxlCglkdW1teV9kcnZfdmlkZW8vTWFrZWZpbGUKCXRlc3QvTWFrZWZpbGUKCXRlc3QvYmFzaWMvTWFrZWZpbGUKCXRlc3QvZGVjb2RlL01ha2VmaWxlCgl0ZXN0L3B1dHN1cmZhY2UvTWFrZWZpbGUKCXRlc3QvZW5jb2RlL01ha2VmaWxlCgl0ZXN0L3ZhaW5mby9NYWtlZmlsZQoJcGtnY29uZmlnL2xpYnZhLWVnbC5wYwoJcGtnY29uZmlnL2xpYnZhLWdseC5wYwoJcGtnY29uZmlnL2xpYnZhLXRwaS5wYwoJcGtnY29uZmlnL2xpYnZhLXgxMS5wYwoJcGtnY29uZmlnL2xpYnZhLnBjCiAgICAgICAgcGtnY29uZmlnL01ha2VmaWxlCl0pCgojIFByaW50IGEgc21hbGwgc3VtbWFyeQoKZWNobyAiIgplY2hvICJsaWJ2YSAtICR7TElCVkFfVkVSU0lPTn0gKFZBLUFQSSAke1ZBX0FQSV9WRVJTSU9OfSkiCmVjaG8gIiIKCmVjaG8gIiCVIEdsb2JhbCA6IgplY2hvICIgICAgIFByZWZpeDogJHtwcmVmaXh9IgplY2hvICIiCgpBU19JRihbdGVzdCB4JGVuYWJsZV9kdW1teV9kcml2ZXIgPSB4eWVzXSwgW0RSSVZFUlM9ImR1bW15ICREUklWRVJTIl0pCgplY2hvICIglSBEcml2ZXJzOiAke0RSSVZFUlN9IgoKQVNfSUYoW3Rlc3QgeCRVU0VfR0xYID0geHllc10sIFtCQUNLRU5EUz0iZ2x4ICRCQUNLRU5EUyJdKQpBU19JRihbdGVzdCB4JFVTRV9FR0wgPSB4eWVzXSwgW0JBQ0tFTkRTPSJlZ2wgJEJBQ0tFTkRTIl0pCgpCQUNLRU5EUz0ieDExICRCQUNLRU5EUyIKQVNfSUYoW3Rlc3QgeCRlbmFibGVfZHVtbXlfYmFja2VuZCA9IHh5ZXNdLCBbQkFDS0VORFM9ImR1bW15IAokQkFDS0VORFMiXSkKCmVjaG8gIiCVIFdpbnN5cyA6ICR7QkFDS0VORFN9IgoK