IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQojIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiMKCiMKIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgojCkFDX0lOSVQoW05ldC1TTk1QXSwgWzUuNC5wcmUyXSwgW25ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRdKQpBQ19QUkVSRVEoWzIuNTldKQpBQ19DT05GSUdfU1JDRElSKFthZ2VudC9taWJncm91cC91Y2Qtc25tcC9leHRlbnNpYmxlLmNdKQpBQ19SRVZJU0lPTihbJFJldmlzaW9uJF0pCgpBQ19DT05GSUdfSEVBREVSKGluY2x1ZGUvbmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmgpCgpBQ19NU0dfQ0FDSEVfSU5JVCgpCgojCiMgc2F2ZSB0aGUgY29uZmlndXJlIGFyZ3VtZW50cwojCkFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0NPTkZJR1VSRV9PUFRJT05TLCIkYWNfY29uZmlndXJlX2FyZ3MiKQpDT05GSUdVUkVfT1BUSU9OUz0iXCIkYWNfY29uZmlndXJlX2FyZ3MiXCIKQUNfU1VCU1QoQ09ORklHVVJFX09QVElPTlMpCgojCiMgQ29tcGlsYXRpb24gc2V0dXAKIwpBQ19BUkdfV0lUSChjYywgWwpDb21waWxlciBPcHRpb25zOgogIC0td2l0aC1jYz1DQyAgICAgICAgICAgICAgICAgICAgdXNlIENDIHRvIGNvbXBpbGUgKGRlZmF1bHQ9Z2NjKS5dLAogICAgW0NDPSR3aXRoX2NjO2V4cG9ydCBDQ10pCgpBQ19BUkdfV0lUSChsaW5rY2MsIFsKQ29tcGlsZXIgT3B0aW9uczoKICAtLXdpdGgtbGlua2NjPUNDICAgICAgICAgICAgICAgIHVzZSBDQyB0byBsaW5rIChkZWZhdWx0PWdjYykuXSwKICAgIFtMSU5LQ0M9JHdpdGhfbGlua2NjO2V4cG9ydCBMSU5LQ0NdKQoKQUNfQVJHX1dJVEgoYXIsClsgIC0td2l0aC1hcj1BUiAgICAgICAgICAgICAgICAgICAgdXNlIEFSIGFzIHRoZSBhcmNoaXZlci5dLAogICAgW0FSPSR3aXRoX2FyOyBleHBvcnQgQVJdKQoKQUNfQVJHX1dJVEgoZW5kaWFubmVzcywKWyAgLS13aXRoLWVuZGlhbm5lc3M9YmlnfGxpdHRsZSAgICBkZWZpbmUgZW5kaWFubmVzcyBvZiB0YXJnZXQgcGxhdGZvcm0gd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MtY29tcGlsaW5nLl0sCiAgICBbaWYgdGVzdCAkd2l0aF9lbmRpYW5uZXNzICE9ICJiaWciIC1hICR3aXRoX2VuZGlhbm5lc3MgIT0gImxpdHRsZSIgOyB0aGVuCiAgICAgICBBQ19NU0dfRVJST1IoW0VuZGlhbm5lc3MgbXVzdCBiZSBiaWcgb3IgbGl0dGxlLCBub3QgIiR3aXRoX2VuZGlhbm5lc3MiLl0pOwogICAgIGZpCl0pCgpBQ19BUkdfV0lUSChjZmxhZ3MsClsgIC0td2l0aC1jZmxhZ3M9Q0ZMQUdTICAgICAgICAgICAgdXNlIENGTEFHUyBhcyBjb21waWxlIHRpbWUgYXJndW1lbnRzLl0sCiAgICBbQ0ZMQUdTPSR3aXRoX2NmbGFnczsgZXhwb3J0IENGTEFHU10pCgpBQ19BUkdfV0lUSChsZGZsYWdzLApbICAtLXdpdGgtbGRmbGFncz1MREZMQUdTICAgICAgICAgIHVzZSBMREZMQUdTIGFzIGxpbmsgdGltZSBhcmd1bWVudHMgdG8gbGQuXSwKICAgIFtMREZMQUdTPSR3aXRoX2xkZmxhZ3M7IGV4cG9ydCBMREZMQUdTXSkKCkFDX0FSR19XSVRIKGxpYnMsClsgIC0td2l0aC1saWJzPUxJQlMgICAgICAgICAgICAgICAgdXNlIExJQlMgYXMgbGluayB0aW1lIGFyZ3VtZW50cyB0byBsZC5dLAogICAgW0xJQlM9JHdpdGhfbGliczsgZXhwb3J0IExJQlNdKQoKQUNfQVJHX0VOQUJMRShzaWxlbnQtbGlidG9vbCwKWyAgLS1lbmFibGUtc2lsZW50LWxpYnRvb2wgICAgICAgICBQYXNzIC0tc2lsZW50IHRvIGxpYnRvb2wuXSwKCUxJQlRPT0xGTEFHUz0tLXNpbGVudCkKQUNfU1VCU1QoTElCVE9PTEZMQUdTKQoKQUNfQVJHX1dJVEgoaW5zdGFsbC1wcmVmaXgsClsgIC0td2l0aC1pbnN0YWxsLXByZWZpeD1QQVRIICAgICAgSnVzdCBmb3IgaW5zdGFsbGluZywgcHJlZml4IGFsbCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHdpdGggUEFUSC4gIFRoaXMgaXMga25vd24gbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3b3JrIG9uIHNvbWUgc3lzdGVtcyB3aXRoIHNoYXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzIChlZywgSFBVWCldLAogICAgICBJTlNUQUxMX1BSRUZJWD0iJHdpdGh2YWwiKQoKaWYgdGVzdCAieCRJTlNUQUxMX1BSRUZJWCIgPSAieHllcyIgOyB0aGVuCiAgQUNfTVNHX0VSUk9SKFstLXdpdGgtaW5zdGFsbC1wcmVmaXggcmVxdWlyZXMgYW4gYXJndW1lbnRdKQpmaQppZiB0ZXN0ICJ4JElOU1RBTExfUFJFRklYIiA9ICJ4bm8iIDsgdGhlbgogIElOU1RBTExfUFJFRklYPSIiCmZpCkFDX1NVQlNUKElOU1RBTExfUFJFRklYKQoKIyBjaGVjayBmb3IgZXJyb3JzIGluIGFyZ3MgdGhhdCBydW4gYWZ0ZXIgbW9kdWxlIHByb2Nlc3NpbmcgaGVyZSwgc28KIyB0aGV5IGZhaWwgYmVmb3JlIG1vZHVsZSBwcm9jZXNzaW5nLi4uCkFDX0FSR19FTkFCTEUobGlid3JhcCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1saWJ3cmFwLy0td2l0aG91dC1saWJ3cmFwIGluc3RlYWQgXSkgKQogIEFDX0FSR19FTkFCTEUoemxpYiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC16bGliLy0td2l0aG91dC16bGliIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShtaW5pX2FnZW50LApbICAtLWVuYWJsZS1taW5pLWFnZW50ICAgICAgICAgICAgIEJ1aWxkIGEgbWluaW1hbCBhZ2VudC5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9taW5pX2FnZW50IiA9ICJ4eWVzIjsgdGhlbgogICAgbWluaV9hZ2VudD0ieWVzIgplbHNlCiAgICBtaW5pX2FnZW50PSJubyIKZmkKQUNfQVJHX1dJVEgobWluaV9hZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWluaS1hZ2VudC8tLWRpc2FibGUtbWluaS1hZ2VudCBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgobWluaWFnZW50LCwKICAgICAgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1taW5pLWFnZW50Ly0tZGlzYWJsZS1taW5pLWFnZW50IGluc3RlYWQgXSkgKQpBQ19BUkdfRU5BQkxFKG1pbmlhZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWluaS1hZ2VudC8tLWRpc2FibGUtbWluaS1hZ2VudCBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoYWdlbnQsClsgIC0tZGlzYWJsZS1hZ2VudCAgICAgICAgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhZ2VudCAoc25tcGQpLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FnZW50IiAhPSAieG5vIjsgdGhlbgogICBTTk1QRD0nc25tcGQkKEVYRUVYVCknCiAgIE1BSU5TVUJTPSIkTUFJTlNVQlMgYWdlbnQiCiAgIFRSQVBMSUJTPSckKFRSQVBEV0lUSEFHRU5UKScKICAgVVNFVFJBUExJQlM9JyQoVVNFQUdFTlRMSUJTKScKZWxzZQogICBTTk1QRD0iIgogICAjIHdlIHN0aWxsIG5lZWQvd2FudCB0aGUgYWdlbnRsaWJzIChmb3Igc3ViYWdlbnRzLCBlLmcuIHNubXB0cmFwZCkKICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBhZ2VudCIKICAgIyBidWlsZGluZyBzbm1wdHJhcGQgdy9vIGFnZW50bGlicyBkb2Vzbid0IHdvcmsgYXRtCiAgICNUUkFQTElCUz0nJChUUkFQRFdJVEhPVVRBR0VOVCknCiAgICNVU0VUUkFQTElCUz0nJChVU0VMSUJTKScKICAgVFJBUExJQlM9JyQoVFJBUERXSVRIQUdFTlQpJwogICBVU0VUUkFQTElCUz0nJChVU0VBR0VOVExJQlMpJwpmaQpBQ19TVUJTVChTTk1QRCkKQUNfU1VCU1QoVFJBUExJQlMpCkFDX1NVQlNUKFVTRVRSQVBMSUJTKQpBQ19BUkdfV0lUSChhZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtYWdlbnQvLS1kaXNhYmxlLWFnZW50IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShhcHBsaWNhdGlvbnMsClsgIC0tZGlzYWJsZS1hcHBsaWNhdGlvbnMgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhcHBzIChzbm1wZ2V0LCAuLi4pLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FwcGxpY2F0aW9ucyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBhcHBzIgpmaQojIENvbW1vbiBtaXN0YWtlcwpBQ19BUkdfV0lUSChhcHBsaWNhdGlvbnMsLAogICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtYXBwbGljYXRpb25zLy0tZGlzYWJsZS1hcHBsaWNhdGlvbnMgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKG1hbnVhbHMsClsgIC0tZGlzYWJsZS1tYW51YWxzICAgICAgICAgICAgICAgRG8gbm90IGluc3RhbGwgdGhlIG1hbnVhbHMuXSkKaWYgdGVzdCAieCRlbmFibGVfbWFudWFscyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBtYW4iCmZpCkFDX0FSR19XSVRIKG1hbnVhbHMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1tYW51YWxzLy0tZGlzYWJsZS1tYW51YWxzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShzY3JpcHRzLApbICAtLWRpc2FibGUtc2NyaXB0cyAgICAgICAgICAgICAgIERvIG5vdCBpbnN0YWxsIHRoZSBzY3JpcHRzIChtaWIyYywgLi4uKS5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9zY3JpcHRzIiAhPSAieG5vIjsgdGhlbgogICBNQUlOU1VCUz0iJE1BSU5TVUJTIGxvY2FsIgpmaQpBQ19BUkdfV0lUSChzY3JpcHRzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtc2NyaXB0cy8tLWRpc2FibGUtc2NyaXB0cyBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUobWlicywKWyAgLS1kaXNhYmxlLW1pYnMgICAgICAgICAgICAgICAgICBEbyBub3QgaW5zdGFsbCB0aGUgbWliIGZpbGVzLl0pCmlmIHRlc3QgIngkZW5hYmxlX21pYnMiICE9ICJ4bm8iOyB0aGVuCiAgIE1BSU5TVUJTPSIkTUFJTlNVQlMgbWlicyIKZmkKIyB3aXRoLW1pYnMgaXMgdmFsaWQgdG9vLCBidXQgbWVhbnMgc29tZXRoaW5nIGVsc2UKCkFDX1NVQlNUKE1BSU5TVUJTKQpBQ19NU0dfQ0hFQ0tJTkcoW3doYXQgdG8gYnVpbGQgYW5kIGluc3RhbGxdKQpBQ19NU0dfUkVTVUxUKFskTUFJTlNVQlNdKQoKQUNfQVJHX0VOQUJMRShtaWItbG9hZGluZywKWyAgLS1kaXNhYmxlLW1pYi1sb2FkaW5nICAgICAgICAgICBEbyBub3QgaW5jbHVkZSBjb2RlIHRoYXQgcGFyc2VzIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlwdWxhdGVzIHRoZSBtaWIgZmlsZXMuXSkKaWYgdGVzdCAieCRlbmFibGVfbWliX2xvYWRpbmciID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElOR10sIDEsIAogICAgICAgICAgICBbRGVmaW5lIGlmIG1pYiBsb2FkaW5nIGFuZCBwYXJzaW5nIGNvZGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZF0pCmZpCkFDX0FSR19XSVRIKG1pYi1sb2FkaW5nLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWliLWxvYWRpbmcvLS1kaXNhYmxlLW1pYi1sb2FkaW5nIGluc3RlYWQgXSkgKQoKIwpTTk1QX1ZFUlNJT05TPSIiCkFDX0FSR19FTkFCTEUoc25tcHYxLApbICAtLWRpc2FibGUtc25tcHYxICAgICAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIFNOTVB2MS5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9zbm1wdjEiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9TTk1QVjFdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBTTk1QdjEgY29kZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkXSkKZWxzZQogIFNOTVBfVkVSU0lPTlM9IiRTTk1QX1ZFUlNJT05TIDEiCmZpCkFDX0FSR19XSVRIKHNubXB2MSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXNubXB2MS8tLWRpc2FibGUtc25tcHYxIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShzbm1wdjJjLApbICAtLWRpc2FibGUtc25tcHYyYyAgICAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIFNOTVB2MmMuXSkKaWYgdGVzdCAieCRlbmFibGVfc25tcHYyYyIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShbTkVUU05NUF9ESVNBQkxFX1NOTVBWMkNdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBTTk1QdjJjIGNvZGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZF0pCmVsc2UKICBTTk1QX1ZFUlNJT05TPSIkU05NUF9WRVJTSU9OUyAyYyIKZmkKQUNfQVJHX1dJVEgoc25tcHYyYywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXNubXB2MmMvLS1kaXNhYmxlLXNubXB2MmMgaW5zdGVhZCBdKSApCgpTTk1QX1ZFUlNJT05TPSIkU05NUF9WRVJTSU9OUyAzIgpBQ19NU0dfQ0FDSEVfQUREKFNOTVAgVmVyc2lvbnMgU3VwcG9ydGVkOiAgICRTTk1QX1ZFUlNJT05TKQoKQUNfQVJHX0VOQUJMRShzZXQtc3VwcG9ydCwKWyAgLS1kaXNhYmxlLXNldC1zdXBwb3J0ICAgICAgICAgICBEbyBub3QgYWxsb3cgU05NUCBzZXQgcmVxdWVzdHMuXSkKaWYgdGVzdCAieCRlbmFibGVfc2V0X3N1cHBvcnQiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9TRVRfU1VQUE9SVF0sIDEsIAogICAgICAgICAgICBbRGVmaW5lIGlmIFNOTVAgU0VUIHN1cHBvcnQgc2hvdWxkIGJlIGRpc2FibGVkXSkKZmkKQUNfQVJHX1dJVEgoc2V0LXN1cHBvcnQsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1zZXQtc3VwcG9ydC8tLWRpc2FibGUtc2V0LXN1cHBvcnQgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKGRlcywKWyAgLS1kaXNhYmxlLWRlcyAgICAgICAgICAgICAgICAgICBEbyBub3Qgc3VwcG9ydCBERVMgZW5jcnlwdGlvbi5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9kZXMiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9ERVNdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBERVMgZW5jcnlwdGlvbiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZF0pCmZpCkFDX0FSR19XSVRIKGRlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWRlcy8tLWRpc2FibGUtZGVzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShwcml2YWN5LApbICAtLWRpc2FibGUtcHJpdmFjeSAgICAgICAgICAgICAgIERvbid0IGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgcHJpdmFjeSAoZW5jcnlwdGlvbikuXSkKaWYgdGVzdCAieCRlbmFibGVfcHJpdmFjeSIgIT0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoTkVUU05NUF9FTkFCTEVfU0NBUElfQVVUSFBSSVYpCmZpCkFDX0FSR19XSVRIKHByaXZhY3ksLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1wcml2YWN5Ly0tZGlzYWJsZS1wcml2YWN5IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShtZDUsClsgIC0tZGlzYWJsZS1tZDUgICAgICAgICAgICAgICAgICAgRG8gbm90IHN1cHBvcnQgTUQ1IGF1dGhlbnRpY2F0aW9uLl0pCmlmIHRlc3QgIngkZW5hYmxlX21kNSIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShbTkVUU05NUF9ESVNBQkxFX01ENV0sIDEsIAogICAgICAgICAgICBbRGVmaW5lIGlmIE1ENSBhdXRoZW50aWNhdGlvbiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZF0pCmZpCkFDX0FSR19XSVRIKG1kNSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLW1kNS8tLWRpc2FibGUtbWQ1IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShpbnRlcm5hbC1tZDUsClsgIC0tZW5hYmxlLWludGVybmFsLW1kNSAgICAgICAgICAgVXNlIHRoZSBpbnRlcm5hbCBNRDUgc3VwcG9ydC5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9pbnRlcm5hbF9tZDUiID0gInh5ZXMiOyB0aGVuCiAgaWYgdGVzdCAieCRlbmFibGVfbWQ1IiA9ICJ4bm8iOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWW91IGNhbiBub3Qgc3BlY2lmeSBib3RoIC0tZW5hYmxlLWludGVybmFsLW1kNSBhbmQgLS1kaXNhYmxlLW1kNSkKICBlbHNlCiAgICBBQ19ERUZJTkUoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KQogIGZpCmZpCkFDX0FSR19XSVRIKGludGVybmFsLW1kNSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWludGVybmFsLW1kNS8tLWRpc2FibGUtaW50ZXJuYWwtbWQ1IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShpcHY2LApbICAtLWVuYWJsZS1pcHY2ICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIElQdjYgcmVhZHkgdmVyc2lvbi5dLAogICAgW2lmIHRlc3QgIngkZW5hYmxlX2lwdjYiID0gInh5ZXMiOyB0aGVuCiAgICAgIEFDX0RFRklORShORVRTTk1QX0VOQUJMRV9JUFY2KQogICAgZmldKQpBQ19BUkdfV0lUSChpcHY2LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtaXB2Ni8tLWRpc2FibGUtaXB2NiBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUobG9jYWwtc211eCwKWyAgLS1lbmFibGUtbG9jYWwtc211eCAgICAgICAgICAgICBSZXN0cmljdCBTTVVYIGNvbm5lY3Rpb25zIHRvIGxvY2FsaG9zdCAoYnkgZGVmYXVsdCkuXSwKICAgIFtpZiB0ZXN0ICJ4JGVuYWJsZV9sb2NhbF9zbXV4IiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19ERUZJTkUoTkVUU05NUF9FTkFCTEVfTE9DQUxfU01VWCkKICAgIGZpXSkKQUNfQVJHX1dJVEgobG9jYWwtc211eCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWxvY2FsLXNtdXgvLS1kaXNhYmxlLWxvY2FsLXNtdXggaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKGRlYnVnZ2luZywKWyAgLS1lbmFibGUtZGVidWdnaW5nICAgICAgICAgICAgICBPdXRwdXRzIGV4dHJhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhdCBhbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzLiAgTm9ybWFsbHksIHlvdSBzaG91bGQgbm90IGVuYWJsZSB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGluc3RlYWQgdXNlIHRoZSAtRCBmbGFnIG9mIHRoZSBjb21tYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRvZ2dsZXMgZGVidWdpbmcgb3V0cHV0IGF0IHJ1bnRpbWUuCiAgLS1kaXNhYmxlLWRlYnVnZ2luZyAgICAgICAgICAgICBEaXNhbGxvd3MgZGVidWdnaW5nIGNvZGUgdG8gYmUgYnVpbHQgaW4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1pZ2h0IHByb3ZpZGUgc29tZSBzcGVlZCBiZW5lZml0cy5dLAogICAgQUNfREVGSU5FKE5FVFNOTVBfQUxXQVlTX0RFQlVHKSkKQUNfQVJHX1dJVEgoZGVidWdnaW5nLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtZGVidWdnaW5nLy0tZGlzYWJsZS1kZWJ1Z2dpbmcgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKGRldmVsb3BlciwKWyAgLS1lbmFibGUtZGV2ZWxvcGVyICAgICAgICAgICAgICBUdXJucyBvbiBzdXBlci1kdXBlci1leHRyYS1jb21waWxlLXdhcm5pbmdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIGdjYy5dLAogICAgZGV2ZWxvcGVyPXllcykKQUNfQVJHX1dJVEgoZGV2ZWxvcGVyLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtZGV2ZWxvcGVyLy0tZGlzYWJsZS1kZXZlbG9wZXIgaW5zdGVhZCBdKSApCgppZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1Z2dpbmciID0gInhubyI7IHRoZW4KICAgIEFDX0RFRklORShORVRTTk1QX05PX0RFQlVHR0lORykKZmkKCkFDX0FSR19XSVRIKGRtYWxsb2MsClsgIC0td2l0aC1kbWFsbG9jPVBBVEggICAgICAgICAgICAgVXNlIGRtYWxsb2MgbGlicmFyeSAod3d3LmRtYWxsb2MuY29tKV0sCiAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiOyB0aGVuCiAgICAgIExJQlM9IiRMSUJTIC1sZG1hbGxvYyIKICAgICAgQUNfREVGSU5FKEhBVkVfRE1BTExPQ19IKQogICAgZWxpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKCR3aXRodmFsKQogICAgICBMSUJTPSIkTElCUyAtbGRtYWxsb2MiCiAgICAgIEFDX0RFRklORShIQVZFX0RNQUxMT0NfSCkKICAgIGZpCikKQUNfU1VCU1QoSEFWRV9ETUFMTE9DX0gpCkFDX0FSR19FTkFCTEUoZG1hbGxvYywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1kbWFsbG9jLy0td2l0aG91dC1kbWFsbG9jIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoZWZlbmNlLApbICAtLXdpdGgtZWZlbmNlICAgICAgICAgICAgICAgICAgIExvb2sgZm9yIGFuZCB1c2UgbGliZWZlbmNlIChtYWxsb2MpLl0sCiAgICAgIHVzZV9lZmVuY2U9IiR3aXRodmFsIikKQUNfQVJHX0VOQUJMRShlZmVuY2UsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZWZlbmNlLy0td2l0aG91dC1lZmVuY2UgaW5zdGVhZCBdKSApCgp0cnlyc2FyZWY9bm8KQUNfQVJHX1dJVEgocnNhcmVmLApbICAtLXdpdGgtcnNhcmVmPVBBVEggICAgICAgICAgICAgIExvb2sgZm9yIGxpYnJzYXJlZiBpbiBQQVRIL2xpYi5dLAogICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIjsgdGhlbgogICAgICB0cnlyc2FyZWY9eWVzCiAgICBlbGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgogICAgICB0cnlyc2FyZWY9bm8KICAgIGVsaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgkd2l0aHZhbCkKICAgICAgdHJ5cnNhcmVmPXllcwogICAgZmksCikKQUNfQVJHX0VOQUJMRShyc2FyZWYsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtcnNhcmVmLy0td2l0aG91dC1yc2FyZWYgaW5zdGVhZCBdKSApCgp0cnlvcGVuc3NsPWRlZmF1bHR5ZXMKYXNrZWRvcGVuc3NsPW5vCkFDX0FSR19XSVRIKG9wZW5zc2wsClsgIC0td2l0aC1vcGVuc3NsPVBBVEggICAgICAgICAgICAgTG9vayBmb3Igb3BlbnNzbCBpbiBQQVRIL2xpYi5dLAogICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIjsgdGhlbgogICAgICB0cnlvcGVuc3NsPXllcwogICAgICBhc2tlZG9wZW5zc2w9eWVzCiAgICBlbGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgogICAgICB0cnlvcGVuc3NsPW5vCiAgICBlbGlmIHRlc3QgLWQgIiR3aXRodmFsIjsgdGhlbgogICAgICBBQ19BRERfU0VBUkNIX1BBVEgoJHdpdGh2YWwpCiAgICAgIHRyeW9wZW5zc2w9eWVzCiAgICAgIGFza2Vkb3BlbnNzbD15ZXMKICAgIGZpLAopCmlmIHRlc3QgIngkdHJ5b3BlbnNzbCIgPSAieGRlZmF1bHR5ZXMiOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgvdXNyL2xvY2FsL3NzbCkKICAgICAgdHJ5b3BlbnNzbD15ZXMKZmkKQUNfQVJHX0VOQUJMRShvcGVuc3NsLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW9wZW5zc2wvLS13aXRob3V0LW9wZW5zc2wgaW5zdGVhZCBdKSApCkFDX0FSR19XSVRIKHNzbCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1vcGVuc3NsLy0td2l0aG91dC1vcGVuc3NsIGluc3RlYWQgXSkgKQpBQ19BUkdfRU5BQkxFKHNzbCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1vcGVuc3NsLy0td2l0aG91dC1vcGVuc3NsIGluc3RlYWQgXSkgKQoKdHJ5a3JiNT1kZWZhdWx0eWVzCmFza2Vka3JiNT1ubwpBQ19BUkdfV0lUSChrcmI1LApbICAtLXdpdGgta3JiNT1QQVRIICAgICAgICAgICAgICAgIExvb2sgZm9yIGtyYjUgaW4gUEFUSC9saWIuXSwKICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyI7IHRoZW4KICAgICAgdHJ5a3JiNT15ZXMKICAgICAgYXNrZWRrcmI1PXllcwogICAgICBrcmI1cGF0aD11bmRlZgogICAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgdHJ5a3JiNT1ubwogICAgICBrcmI1cGF0aD11bmRlZgogICAgZWxpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgdHJ5a3JiNT15ZXMKICAgICAgYXNrZWRrcmI1PXllcwogICAgICBrcmI1cGF0aD0kd2l0aHZhbAogICAgZmksCikKaWYgdGVzdCAieCR0cnlrcmI1IiA9ICJ4ZGVmYXVsdHllcyI7IHRoZW4KICAgICAgdHJ5a3JiNT15ZXMKICAgICAga3JiNXBhdGg9L3Vzci9rZXJiZXJvcwpmaQpBQ19BUkdfRU5BQkxFKGtyYjUsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgta3JiNS8tLXdpdGhvdXQta3JiNSBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKHJwbSwKWyAgLS13aXRob3V0LXJwbSAgICAgICAgICAgICAgICAgICBEb24ndCBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBSUE0gcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCBzeXN0ZW0gd2hlbiBidWlsZGluZyB0aGUgaG9zdCBNSUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5dKQpBQ19BUkdfRU5BQkxFKHJwbSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1ycG0vLS13aXRob3V0LXJwbSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoYWdlbnR4LWRvbS1zb2NrLW9ubHksClsgIC0tZW5hYmxlLWFnZW50eC1kb20tc29jay1vbmx5ICAgRGlzYWJsZSBVRFAvVENQIHRyYW5zcG9ydHMgZm9yIGFnZW50eC5dLApBQ19ERUZJTkUoTkVUU05NUF9BR0VOVFhfRE9NX1NPQ0tfT05MWSkpCkFDX0FSR19XSVRIKGFnZW50eC1kb20tc29jay1vbmx5LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtYWdlbnR4LWRvbS1zb2NrLW9ubHkvLS1kaXNhYmxlLWFnZW50eC1kb20tc29jay1vbmx5IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShzbm1wdHJhcGQtc3ViYWdlbnQsClsgIC0tZGlzYWJsZS1zbm1wdHJhcGQtc3ViYWdlbnQgICAgRGlzYWJsZSBhZ2VudHggc3ViYWdlbnQgY29kZSBpbiBzbm1wdHJhcGQuXSkKaWYgdGVzdCAieCRlbmFibGVfc25tcHRyYXBkX3N1YmFnZW50IiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5FVFNOTVBfU05NUFRSQVBEX0RJU0FCTEVfQUdFTlRYKQpmaQpBQ19BUkdfV0lUSChzbm1wdHJhcGQtc3ViYWdlbnQsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1zbm1wdHJhcGQtc3ViYWdlbnQvLS1kaXNhYmxlLXNubXB0cmFwZC1zdWJhZ2VudCBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKG9wYXF1ZS1zcGVjaWFsLXR5cGVzLApbICAtLXdpdGhvdXQtb3BhcXVlLXNwZWNpYWwtdHlwZXMgIERvbid0IHVzZSBzcGVjaWFsIG9wYXF1ZSBlbmNvZGluZ3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QIG5vcm1hbGx5IGNhbm5vdCBoYW5kbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nIG51bWJlcnMsIG5vciBsYXJnZSA2NCBiaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXJzIHdlbGwuICBCeSBkZWZhdWx0LCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC1zbm1wIHBhY2thZ2UgY29tcGlsZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZXNlIGV4dHJhIGRhdGF0eXBlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIGEgbGVnYWwgd2F5KV0pCkFDX0FSR19FTkFCTEUob3BhcXVlLXNwZWNpYWwtdHlwZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtb3BhcXVlLXNwZWNpYWwtdHlwZXMvLS13aXRob3V0LW9wYXF1ZS1zcGVjaWFsLXR5cGVzIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgobWliZGlycywKWyAgLS13aXRoLW1pYmRpcnM9XCJkaXIxOmRpcjI6XCIgICBEZWZhdWx0IGRpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIG1pYnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogXCRIT01FLy5zbm1wL21pYnM6REFUQURJUi9zbm1wL21pYnMpXSwKICAgIFtORVRTTk1QX0RFRkFVTFRfTUlCRElSUz0iJHdpdGhfbWliZGlycyIKICAgIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfTUlCRElSUywiJHdpdGhfbWliZGlycyIpXSkKQUNfQVJHX0VOQUJMRShtaWJkaXJzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW1pYmRpcnMvLS13aXRob3V0LW1pYmRpcnMgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChtaWJzLApbICAtLXdpdGgtbWlicz1cIml0ZW0xOml0ZW0yOlwiICAgIERlZmF1bHQgbWliIElEcyB0byByZWFkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRoZSBkZWZhdWx0IGxpc3QgaXMgXCJJUC1NSUI6SUYtTUlCOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENQLU1JQjpVRFAtTUlCOlNOTVB2Mi1NSUI6UkZDMTIxMy1NSUJcIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYWRkaXRpb24gb2YgYW55IG1pYnMgdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIG1pYiBtb2R1bGVzIHRoZSBhZ2VudCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB3aXRoKV0sCiAgICBORVRTTk1QX0RFRkFVTFRfTUlCUz0iJHdpdGhfbWlicyIpCiMgZW5hYmxlLW1pYnMgaXMgdmFsaWQgdG9vLCBidXQgbWVhbnMgc29tZXRoaW5nIGVsc2UKCkFDX0FSR19XSVRIKG1pYmZpbGVzLApbICAtLXdpdGgtbWliZmlsZXM9XCJmaWxlMTpmaWxlMlwiIERlZmF1bHQgbWliIGZpbGVzIHRvIGxvYWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogIG5vbmUuICB1c2VzIElEcyBhYm92ZSBpbnN0ZWFkLildLAogICAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUywiJHdpdGhfbWliZmlsZXMiKSkKQUNfQVJHX0VOQUJMRShtaWJmaWxlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1taWJmaWxlcy8tLXdpdGhvdXQtbWliZmlsZXMgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKG1pYi1jb25maWctY2hlY2tpbmcsClsgIC0tZW5hYmxlLW1pYi1jb25maWctY2hlY2tpbmcgICAgVHVybnMgb24gZXh0cmEgY2hlY2tzIGR1cmluZyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtaWIgbW9kdWxlcy4gQW55IGNvbmZsaWN0cyB3aWxsIGNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgdG8gYWJvcnQgKGRlZmF1bHQgaXMgdG8gaXNzdWUgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyBhbmQgY29udGludWUuKV0sCiAgICB3aXRoX21pYl9jZmdfY2hlY2tzPSJ5ZXMiLHdpdGhfbWliX2NmZ19jaGVja3M9Im5vIikKQUNfQVJHX1dJVEgobWliLWNvbmZpZy1jaGVja2luZywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLW1pYi1jb25maWctY2hlY2tpbmcvLS1kaXNhYmxlLW1pYi1jb25maWctY2hlY2tpbmcgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKG1pYi1jb25maWctZGVidWcsClsgIC0tZW5hYmxlLW1pYi1jb25maWctZGVidWcgICAgICAgVHVybnMgb24gdmVyYm9zZSBvdXRwdXQgZHVyaW5nIG1pYiBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBwcm9jZXNzaW5nLildLAogICAgd2l0aF9taWJfY2ZnX2RlYnVnPSJ5ZXMiLHdpdGhfbWliX2NmZ19kZWJ1Zz0ibm8iKQpBQ19BUkdfV0lUSChtaWItY29uZmlnLWNoZWNraW5nLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWliLWNvbmZpZy1jaGVja2luZy8tLWRpc2FibGUtbWliLWNvbmZpZy1jaGVja2luZyBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUobWZkLXJld3JpdGVzLApbICAtLWVuYWJsZS1tZmQtcmV3cml0ZXMgICAgICAgICAgIFVzZSBuZXcgTUZEIHJld3JpdGVzIG9mIG1pYiBtb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgYXZhaWxhYmxlLiAoZGVmYXVsdCBpcyB0byB1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIG1pYiBtb2R1bGUgY29kZSkuXSkKaWYgdGVzdCAieCRlbmFibGVfbWZkX3Jld3JpdGVzIiA9ICJ4eWVzIjsgdGhlbgogICBBQ19ERUZJTkUoTkVUU05NUF9FTkFCTEVfTUZEX1JFV1JJVEVTKQpmaQpBQ19BUkdfV0lUSChtZmQtcmV3cml0ZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1tZmQtcmV3cml0ZXMvLS1kaXNhYmxlLW1mZC1yZXdyaXRlcyBpbnN0ZWFkIF0pICkKCmFza2VkcGtjcz1ubwpBQ19BUkdfV0lUSChwa2NzLApbICAtLXdpdGgtcGtjcz1QQVRIICAgICAgICAgICAgICAgIExvb2sgZm9yIHBrY3MxMSBpbiBQQVRIL2xpYi5dLAogICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIjsgdGhlbgogICAgICBhc2tlZHBrY3M9eWVzCiAgICBlbGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgogICAgICBhc2tlZHBrY3M9bm8KICAgIGVsaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgkd2l0aHZhbCkKICAgICAgYXNrZWRwa2NzPXllcwogICAgZmksCikKQUNfQVJHX0VOQUJMRShwa2NzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXBrY3MvLS13aXRob3V0LXBrY3MgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKHRlc3RpbmctY29kZSwKWyAgLS1lbmFibGUtdGVzdGluZy1jb2RlICAgICAgICAgICBFbmFibGVzIHNvbWUgY29kZSBzZWN0aW9ucyB0aGF0IHNob3VsZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZyBvZiBjZXJ0YWluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QIGZ1bmN0aW9uYWxpdGllcy4gIFRoaXMgc2hvdWxkICpub3QqIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdHVybmVkIG9uIGZvciBwcm9kdWN0aW9uIHVzZS4gIEV2ZXIuXSwKICAgIEFDX0RFRklORShORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUpKQpBQ19BUkdfV0lUSCh0ZXN0aW5nLWNvZGUsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS10ZXN0aW5nLWNvZGUvLS1kaXNhYmxlLXRlc3RpbmctY29kZSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUocmVlbnRyYW50LApbICAtLWVuYWJsZS1yZWVudHJhbnQgICAgICAgICAgICAgIEVuYWJsZXMgbG9ja2luZyBmdW5jdGlvbnMgdGhhdCBwcm90ZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHJlc291cmNlcyBpbiBzb21lIG11bHRpLXRocmVhZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRzLiAgVGhpcyBkb2VzIG5vdCBndWFyYW50ZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1zYWZlIG9wZXJhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSBhbiBleHBlcmltZW50YWwgc2V0dGluZy5dLAogICAgd2l0aF9yZXNfbG9ja3M9InllcyIsd2l0aF9yZXNfbG9ja3M9Im5vIikKQUNfQVJHX1dJVEgocmVlbnRyYW50LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtcmVlbnRyYW50Ly0tZGlzYWJsZS1yZWVudHJhbnQgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChyb290LWFjY2VzcywKWwpDb25maWd1cmluZyB0aGUgYWdlbnQ6CiAgLS13aXRob3V0LXJvb3QtYWNjZXNzICAgICAgICAgICBUaGUgc25tcGQgYWdlbnQgd29uJ3QgcmVxdWlyZSByb290IGFjY2VzcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIGl0LiAgVGhlIGluZm9ybWF0aW9uIGl0IHJldHVybnMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWItSUkgdHJlZSBtYXkgbm90IGJlIGNvcnJlY3QsIGhvd2V2ZXIuXSkKQUNfQVJHX0VOQUJMRShyb290LWFjY2VzcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1yb290LWFjY2Vzcy8tLXdpdGhvdXQtcm9vdC1hY2Nlc3MgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChrbWVtLXVzYWdlLApbICAtLXdpdGhvdXQta21lbS11c2FnZSAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIGFueSBjb2RlIHJlbGF0ZWQgdG8gdGhlIHVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Yga21lbS4gVGhpcyBvcHRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uIC0tZW5hYmxlLW1pbmktYWdlbnQuXSkKQUNfQVJHX0VOQUJMRShrbWVtLXVzYWdlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWttZW0tdXNhZ2UvLS13aXRob3V0LWttZW0tdXNhZ2UgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChkdW1teS12YWx1ZXMsClsgIC0td2l0aC1kdW1teS12YWx1ZXMgICAgICAgICAgICAgUHJvdmlkZSAncGxhY2Vob2xkZXInIGR1bW15IHZhbHVlcyB3aGVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0ZWNobmljYWxseSBub3QgY29tcGxpYW50IHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QIHNwZWNpZmljYXRpb25zLCBidXQgd2FzIGhvdyB0aGUgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGVkIGZvciB2ZXJzaW9ucyA8IDQuMC5dKQpBQ19BUkdfRU5BQkxFKGR1bW15LXZhbHVlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1kdW1teS12YWx1ZXMvLS13aXRob3V0LWR1bW15LXZhbHVlcyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKHBlcnNpc3RlbnQtZGlyZWN0b3J5LApbICAtLXdpdGgtcGVyc2lzdGVudC1kaXJlY3Rvcnk9XCJkaXJlY3RvcnlcIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHBlcnNpc3RlbnQgZGF0YSBzdG9yYWdlLl0sYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9QRVJTSVNURU5UX0RJUkVDVE9SWT0iJHdpdGhfcGVyc2lzdGVudF9kaXJlY3RvcnkiKQpBQ19BUkdfRU5BQkxFKHBlcnNpc3RlbnQtZGlyZWN0b3J5LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXBlcnNpc3RlbnQtZGlyZWN0b3J5Ly0td2l0aG91dC1wZXJzaXN0ZW50LWRpcmVjdG9yeSBpbnN0ZWFkIF0pICkKCmRlZmF1bHRfcGVyc2lzdGVudF9tYXNrPTA3NwpBQ19BUkdfV0lUSChwZXJzaXN0ZW50LW1hc2ssClsgIC0td2l0aC1wZXJzaXN0ZW50LW1hc2s9XCJtYXNrXCIgIERlZmF1bHQgbWFzayBmb3IgcGVyc2lzdGVudCBkYXRhIHN0b3JhZ2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogMDc3KV0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBtYXNrIHZhbHVlIF0pOwogIGZpCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBkZWZhdWx0IHBlcnNpc3RlbnQgbWFzayAkd2l0aHZhbCkKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9QRVJTSVNURU5UX01BU0ssJHdpdGh2YWwpCl0sWwogIEFDX01TR19SRVNVTFQodXNpbmcgZGVmYXVsdCBwZXJzaXN0ZW50IG1hc2sgJGRlZmF1bHRfcGVyc2lzdGVudF9tYXNrKQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1BFUlNJU1RFTlRfTUFTSywkZGVmYXVsdF9wZXJzaXN0ZW50X21hc2spCl0pCkFDX0FSR19FTkFCTEUocGVyc2lzdGVudC1tYXNrLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXBlcnNpc3RlbnQtbWFzayBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGNvcHlfcGVyc2lzdGVudF9maWxlcywKWyAgLS13aXRoLWNvcHktcGVyc2lzdGVudC1maWxlcz1cIm5vXCIgRG9uJ3QgY29weSBwZXJzaXN0ZW50IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgdXNlIFwieWVzXCIgdG8gY29weSB0aGVtKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiB5ZXMpXSwKICAgIGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUz0iJHdpdGhfY29weV9wZXJzaXN0ZW50X2ZpbGVzIikKQUNfQVJHX0VOQUJMRShjb3B5X3BlcnNpc3RlbnRfZmlsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtY29weV9wZXJzaXN0ZW50X2ZpbGVzLy0td2l0aG91dC1jb3B5X3BlcnNpc3RlbnRfZmlsZXMgaW5zdGVhZCBdKSApCgpkZWZhdWx0X2FnZW50eF9zb2NrZXQ9Ii92YXIvYWdlbnR4L21hc3RlciIKQUNfQVJHX1dJVEgoYWdlbnR4LXNvY2tldCwKWyAgLS13aXRoLWFnZW50eC1zb2NrZXQ9RklMRSAgICAgICAgIEFnZW50WCBzb2NrZXQgKERlZmF1bHQ6IC92YXIvYWdlbnR4L21hc3RlciBhcyBzcGVjaWZpZWQgaW4gUkZDMjc0MSldLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgZnVsbCBwYXRoIF0pOwogIGZpCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBBZ2VudFggc29ja2V0ICR3aXRodmFsKQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0FHRU5UWF9TT0NLRVQsIiR3aXRodmFsIixbVW5peCBkb21haW4gc29ja2V0IGZvciBBZ2VudFggbWFzdGVyLXN1YmFnZW50IGNvbW11bmljYXRpb25dKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgQWdlbnRYIHNvY2tldCAkZGVmYXVsdF9hZ2VudHhfc29ja2V0KQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0FHRU5UWF9TT0NLRVQsIiRkZWZhdWx0X2FnZW50eF9zb2NrZXQiLFtVbml4IGRvbWFpbiBzb2NrZXQgZm9yIEFnZW50WCBtYXN0ZXItc3ViYWdlbnQgY29tbXVuaWNhdGlvbl0pCl0pCkFDX0FSR19FTkFCTEUoYWdlbnR4LXNvY2tldCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1hZ2VudHgtc29ja2V0IGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoZGVmYXVsdC1zbm1wLXZlcnNpb24sClsgIC0td2l0aC1kZWZhdWx0LXNubXAtdmVyc2lvbj1cIjNcIiBEZWZhdWx0IHZlcnNpb24gb2YgU05NUCB0byB1c2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiAzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbCB2YWx1ZXM6IDEsIDIgKGZvciBTTk1QdjJjKSBvciAzLl0sCiAgICBhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OPSIkd2l0aF9kZWZhdWx0X3NubXBfdmVyc2lvbiIpCkFDX0FSR19FTkFCTEUoZGVmYXVsdC1zbm1wLXZlcnNpb24sLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZGVmYXVsdC1zbm1wLXZlcnNpb24vLS13aXRob3V0LWRlZmF1bHQtc25tcC12ZXJzaW9uIGluc3RlYWQgXSkgKQoKIyB3ZSB0ZXN0IHRoaXMgbm93IGFuZCBsYXRlciBhcyB3ZWxsLiAgd2UgdGVzdCBpdCBub3cgc28gY29uZmlndXJlIGNhbiBkaWUKIyBlYXJseSBvbiB3aXRoIGFuIGVycm9yIHJhdGhlciB0aGFuIHdhaXRpbmcgdGlsbCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQuCmlmIHRlc3QgIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgIT0gIngiOyB0aGVuCiAgaWYgdGVzdCAiJGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04iICE9ICIxIiAtYSAiJGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04iICE9ICIyIiAtYSAiJGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04iICE9ICIzIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKElsbGVnYWwgdmVyc2lvbiBudW1iZXIgcGFzc2VkIHRvIC0td2l0aC1kZWZhdWx0LXNubXAtdmVyc2lvbikKICBmaQpmaQoKQUNfQVJHX1dJVEgoc3lzX2NvbnRhY3QsClsgIC0td2l0aC1zeXMtY29udGFjdD1cIndob0B3aGVyZVwiICBEZWZhdWx0IHN5c3RlbSBjb250YWN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogTE9HSU5ARE9NQUlOTkFNRSldLAogICAgYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9TWVNfQ09OVEFDVD0iJHdpdGhfc3lzX2NvbnRhY3QiKQpBQ19BUkdfRU5BQkxFKHN5c19jb250YWN0LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXN5cy1jb250YWN0Ly0td2l0aG91dC1zeXMtY29udGFjdCBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKHN5c19sb2NhdGlvbiwKWyAgLS13aXRoLXN5cy1sb2NhdGlvbj1cImxvY2F0aW9uXCIgIERlZmF1bHQgc3lzdGVtIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogVW5rbm93bildLAogICAgYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9TWVNfTE9DPSIkd2l0aF9zeXNfbG9jYXRpb24iKQpBQ19BUkdfRU5BQkxFKHN5c19sb2NhdGlvbiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1zeXMtbG9jYXRpb24vLS13aXRob3V0LXN5cy1sb2NhdGlvbiBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGxvZ2ZpbGUsClsgIC0td2l0aC1sb2dmaWxlPVwibG9jYXRpb25cIiAgICAgICBEZWZhdWx0IGxvZyBmaWxlIGxvY2F0aW9uIGZvciBzbm1wZC5dLAogICAgYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9MT0dGSUxFPSIkd2l0aF9sb2dmaWxlIikKQUNfQVJHX0VOQUJMRShsb2dmaWxlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWxvZ2ZpbGUvLS13aXRob3V0LWxvZ2ZpbGUgaW5zdGVhZCBdKSApCgojIFRoaXMgY2FuJ3QgYmUgd2l0aGluIEFDX0FSR19XSVRILiAgSSBkb24ndCB3YW50IHRvIHJlYWQgYXV0b2NvbmYgbTQKIyB0byBmaW5kIG91dCB3aHkuCkFDX1NVQlNUKFdSQVBMSUJTKQoKQUNfQVJHX1dJVEgodHJhbnNwb3J0cywKWyAgLS13aXRoLXRyYW5zcG9ydHM9XCJ0MSB0MiAuLi5cIiAgIENvbXBpbGUgaW4gdGhlIGdpdmVuIFNOTVAgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgKHNwYWNlIHNlcGFyYXRlZCBsaXN0KS5dKQpBQ19BUkdfV0lUSChvdXRfdHJhbnNwb3J0cywKWyAgLS13aXRoLW91dC10cmFuc3BvcnRzPVwidDEgLi4uXCIgIEV4Y2x1ZGUgbGlzdGVkIFNOTVAgdHJhbnNwb3J0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BhY2Ugc2VwYXJhdGVkIGxpc3QpLgoKICBBdmFpbGFibGUgU05NUCB0cmFuc3BvcnQgbW9kdWxlcyBhcmU6CgogICAgVURQICAgICAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIFVEUC9JUC4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGFsd2F5cyBjb21waWxlZCBpbi4KICAgIFVEUElQdjYgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBVRFAvSVB2Ni4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBmb3IgTGludXgsIFNvbGFyaXMgYW5kCiAgICAgICAgICAgICAgICBGcmVlQlNELgogICAgICAgICAgICAgICAgSXQgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KICAgIFRDUElQdjYgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBVRFAvSVB2Ni4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBmb3IgTGludXgsIFNvbGFyaXMgYW5kCiAgICAgICAgICAgICAgICBGcmVlQlNELgogICAgICAgICAgICAgICAgSXQgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KICAgIFRDUCAgICAgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBUQ1AvSVAuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LCBidXQgbWF5IGJlIG9taXR0ZWQuCiAgICBVbml4ICAgICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgVW5peCBkb21haW4gcHJvdG9jb2xzLgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBleGNlcHQgb24gV2luMzIKICAgICAgICAgICAgICAgIHBsYXRmb3JtcywgYW5kIG1heSBiZSBvbWl0dGVkLgogICAgQ2FsbGJhY2sgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIGFuIGludGVybmFsIGxvY2FsbHkgY29ubmVjdGVkIHBhaXIKICAgICAgICAgICAgICAgIG9mIHNubXBfc2Vzc2lvbnMuCiAgICBBQUw1UFZDICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgQUFMNSBQVkNzLgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgcHJlc2VudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBMaW51eCwKICAgICAgICAgICAgICAgIGlzIG5ldmVyIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQgYW5kIG1heSBiZSBvbWl0dGVkLgogICAgSVBYICAgICAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIElQWCBwZXIgUkZDIDE0MjAuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBwcmVzZW50bHkgb25seSBhdmFpbGFibGUgZm9yIExpbnV4LAogICAgICAgICAgICAgICAgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBhbmQgbWF5IGJlIG9taXR0ZWQuCl0pCgojCiMgQ2F0Y2ggY29tbW9uIG1pc3Rha2VzIGluIHRyYW5zcG9ydCBvcHRpb25zCiMKQUNfQVJHX1dJVEgodHJhbnNwb3J0LCwgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtdHJhbnNwb3J0cy8tLXdpdGhvdXQtdHJhbnNwb3J0cyBpbnN0ZWFkIF0pICAgICApCkFDX0FSR19XSVRIKG91dC10cmFuc3BvcnQsLEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW91dC10cmFuc3BvcnRzLy0td2l0aG91dC1vdXQtdHJhbnNwb3J0cyBpbnN0ZWFkIF0pICkKCiMKIyBzZWN1cml0eSBtb2R1bGVzCiMKCkFDX0FSR19XSVRIKHNlY3VyaXR5LW1vZHVsZXMsClsgIC0td2l0aC1zZWN1cml0eS1tb2R1bGVzPVwiczEgczIgLi4uXCIgICBDb21waWxlIGluIHRoZSBnaXZlbiBTTk1QIHNlY3VyaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBzZXJ2aWNlcyAoc3BhY2Ugc2VwYXJhdGVkIGxpc3QpLgoKICBBdmFpbGFibGUgU05NUCBzZWN1cml0eSBzZXJ2aWNlczoKCiAgICAgICAgdXNtICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIHVzZXIgYmFzZWQgU05NUCBzZWN1cml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWlyZWQgYW5kIGFsd2F5cyBjb21waWxlZCBpbikKICAgICAgICBrc20gICAgICAgICAgICAgICAgc3VwcG9ydCBmb3Iga2VyYmVyb3MgYmFzZWQgU05NUCBzZWN1cml0eQpdKQpBQ19BUkdfRU5BQkxFKHNlY3VyaXR5LW1vZHVsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtc2VjdXJpdHktbW9kdWxlcy8tLXdpdGhvdXQtc2VjdXJpdHktbW9kdWxlcyBpbnN0ZWFkIF0pICkKCiMKIyBtaWIgbW9kdWxlcwojCgpBQ19BUkdfV0lUSChtaWJfbW9kdWxlcywKWyAgLS13aXRoLW1pYi1tb2R1bGVzPVwiaXRlbTEgLi4uXCIgIENvbXBpbGUgd2l0aCBhZGRpdGlvbmFsIG1pYiBtb2R1bGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTcGFjZSBzZXBhcmF0ZWQgbGlzdCkuXSkKQUNfQVJHX0VOQUJMRShtaWJfbW9kdWxlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1taWItbW9kdWxlcy8tLXdpdGhvdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChvdXRfbWliX21vZHVsZXMsClsgIC0td2l0aC1vdXQtbWliLW1vZHVsZXM9XCJsaXN0XCIgICBDb21waWxlIHdpdGhvdXQgdGhlc2UgbWliIG1vZHVsZXMuCgogIERlZmF1bHQgbWliIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgYWdlbnQgKHdoaWNoIGNhbiBiZSByZW1vdmVkKToKICAKICAgIG1pYklJICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIG1pYi1JSSB0cmVlLgogICAgc25tcHYzbWlicyAgICAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgc25tcHYzIG1pYiBtb2R1bGVzLgogICAgdWNkX3NubXAgICAgICAgICAgICAgICBVQ0QtU05NUC1NSUIgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KICAgIGFnZW50X21pYnMgICAgICAgICAgICAgTkVULVNOTVAtQUdFTlQtTUlCIGV4dGVuc2lvbnMKICAgIGFnZW50eCAgICAgICAgICAgICAgICAgQWdlbnRYIHN1cHBvcnQgKHNlZSBiZWxvdykKICAgIG5vdGlmaWNhdGlvbiAgICAgICAgICAgbWlicyBzdXBwb3J0aW5nIHNwZWNpZmljYXRpb24gb2YgdHJhcCBkZXN0aW5hdGlvbnMuCiAgICB0YXJnZXQgICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBTTk1QIFdHcyBUQVJHRVQtTUlCLgogICAgdXRpbGl0aWVzICAgICAgICAgICAgICBnZW5lcmFsIGFnZW50IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzLgogICAgZGlzbWFuL2V2ZW50ICAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgRElTTUFOLUVWRU5ULU1JQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXBwb3J0cyBzZWxmIG1vbml0b3JpbmcgYW5kIG5vdGlmaWNhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnkgd2hlbiBlcnJvciBjb25kaXRpb25zIGFyZSBmb3VuZCkKICAgIGRpc21hbi9zY2hlZHVsZSAgICAgICAgc3VwcG9ydCBmb3IgdGhlIERJU01BTi1TQ0hFRFVMRS1NSUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlciBTRVQgcmVxdWVzdHMgYXQgc3BlY2lmaWVkIHRpbWVzKQogICAgaG9zdCAgICAgICAgICAgICAgICAgICBob3N0IHJlc291cmNlcyBtaWIgc3VwcG9ydC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSBvbiBtYWpvciBzdXBwb3J0ZWQgcGxhdGZvcm1zKQoKICBPcHRpb25hbCBtaWIgbW9kdWxlcyB0aGF0IGNhbiBiZSBidWlsdCBpbnRvIHRoZSBhZ2VudCBpbmNsdWRlOgogICAgc211eCAgICAgICAgICAgICAgICAgICBzbXV4IHN1cHBvcnQgdG8gYWxsb3cgc3ViYWdlbnRzIHRvIGF0dGFjaCB0byBzbm1wZC4KICAgIG1pYklJL210YV9zZW5kbWFpbCAgICAgU2VuZG1haWwgc3RhdGlzdGljcyBtb25pdG9yaW5nIChNVEEtTUlCKQogICAgdWNkLXNubXAvZGlza2lvICAgICAgICBUYWJsZSBvZiBpby1kZXZpY2VzIGFuZCBob3cgbXVjaCBkYXRhIHRoZXkgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXR0ZW4uICAob25seSB0ZXN0ZWQgb24gU29sYXJpcywgTGludXgpCiAgICBkaXNtYW4vb2xkLWV2ZW50LW1pYiAgIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBESVNNQU4tRVZFTlQtTUlCCgogIE9wdGlvbmFsIG1vZHVsZXMgZm9yIHNwZWNpZmljIHBsYXRmb3JtcwogICAgTGludXgKICAgICAgdWNkLXNubXAvbG1TZW5zb3JzICAgaGFyZHdhcmUgbW9uaXRvcmluZyAoTE0tU0VOU09SUy1NSUIpCiAgICAgIHR1bm5lbCAgICAgICAgICAgICAgIExpbnV4IFRVTk5FTC1NSUIgc3VwcG9ydCAoaWZUYWJsZSBleHRlbnNpb24pCiAgICAgIG1pYklJL2ludGVyZmFjZXMgICAgIChvbGQgaWZUYWJsZSBpbXBsZW1lbnRhdGlvbikKICAgICAgdGNwLW1pYiAgICAgICAgICAgICAgKGV4cGVyaW1lbnRhbCkgdGNwQ29ubmVjdGlvblRhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BMaXN0ZW5lclRhYmxlCiAgICAgIHVkcC1taWIgICAgICAgICAgICAgIChleHBlcmltZW50YWwpIHVkcEVuZHBvaW50VGFibGUKICAgICAgaXAtbWliL2lwdjRJbnRlcmZhY2VUYWJsZSAgKGV4cGVyaW1lbnRhbCkKICAgICAgaXAtbWliL2lwdjZJbnRlcmZhY2VUYWJsZSAgKGV4cGVyaW1lbnRhbCkKICAgICAgbWlzYy9pcGZ3YWNjICAgICAgICAgYWNjb3VudGluZyBydWxlcyBJUCBmaXJld2FsbCBpbmZvcm1hdGlvbgogICAgICBpcGZ3Y2hhaW5zL2lwZndjaGFpbnMgIGZpcmV3YWxsIGNoYWlucyB1bmRlciBpcGZ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlZSBhZ2VudC9taWJncm91cC9pcGZ3Y2hhaW5zL1JFQURNRSkKCiAgICBTb2xhcmlzCiAgICAgIHVjZC1zbm1wL2xtU2Vuc29ycyAgIGhhcmR3YXJlIG1vbml0b3JpbmcgKExNLVNFTlNPUlMtTUlCKQoKICBBZ2VudFggc3VwcG9ydDoKICAgIGFnZW50eC9zdWJhZ2VudCAgICAgICAgYWxsb3dzIHRoZSBhZ2VudCB0byBydW4gYXMgZWl0aGVyIGEgc25tcCBhZ2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhcyBhbiBhZ2VudFggc3ViLWFnZW50LgogICAgYWdlbnR4L21hc3RlciAgICAgICAgICBtYWtlcyB0aGUgYWdlbnQgcnVuIGFzIGFuIGFnZW50WCBtYXN0ZXIgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbCBhcyBhIG5vcm1hbCBzbm1wIGFnZW50LgogICAgYWdlbnR4ICAgICAgICAgICAgICAgICBpbmNsdWRlcyBib3RoIGFnZW50eC9tYXN0ZXIgYW5kIGFnZW50eC9jbGllbnQuCgogIE9wdGlvbmFsIG1vZHVsZXMgZm9yIEMgY29kZXJzIHRvIGxvb2sgYXQgYW5kL29yIGluY2x1ZGUgYXMgZXh0ZW5zaW9uIGV4YW1wbGVzOgogIAogICAgZXhhbXBsZXMvdWNkRGVtb1B1YmxpYyAgU05NUHYzIGludGVyb3BlcmFiaWxpdHkgdGVzdGluZyBtaWIuCiAgICBleGFtcGxlcy9leGFtcGxlICAgICAgICBleGFtcGxlIEMgY29kZSBleHRlbnNpb24uXSkKQUNfQVJHX0VOQUJMRShvdXRfbWliX21vZHVsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtb3V0LW1pYi1tb2R1bGVzLy0td2l0aG91dC1vdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCgoKIwpBQ19BUkdfV0lUSChlbnRlcnByaXNlLW9pZCwKW0VudGVycHJpc2UgT0lEczogICh3YXJuaW5nOiB0aGlzIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbi4pCgogIC0td2l0aC1lbnRlcnByaXNlLW9pZCAgICAgICAgICAgICAgVGhlIGVudGVycHJpc2UgbnVtYmVyIGFzc2lnbmVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yIGJ5IElBTkEuICBTZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaWFuYS5vcmcvY2dpLWJpbi9lbnRlcnByaXNlLnBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQgb25lLCB0aG91Z2ggdXNpbmcgdGhlIGRlZmF1bHQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UgaXMgbW9zdCBjYXNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDgwNzIgPSAiZW50ZXJwcmlzZS5uZXQtc25tcCIpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgZW50ZXJwcmlzZSBudW1iZXIgXSk7CiAgZmkKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9FTlRFUlBSSVNFX09JRCwgJHdpdGh2YWwpCiAgZW50X29pZD0iMSwzLDYsMSw0LDEsJHdpdGh2YWwiCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfRU5URVJQUklTRV9NSUIsICRlbnRfb2lkKQogIGVudF9kb3Rfb2lkPSIxLjMuNi4xLjQuMS4kd2l0aHZhbCIKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9FTlRFUlBSSVNFX0RPVF9NSUIsICRlbnRfZG90X29pZCkKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGVudGVycHJpc2UgbnVtYmVyICR3aXRodmFsKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgImVudGVycHJpc2UubmV0LXNubXAiKQpdKQpBQ19BUkdfRU5BQkxFKGVudGVycHJpc2Utb2lkLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWVudGVycHJpc2Utb2lkLy0td2l0aG91dC1lbnRlcnByaXNlLW9pZCBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGVudGVycHJpc2Utc3lzb2lkLApbCiAgLS13aXRoLWVudGVycHJpc2Utc3lzb2lkICAgICAgICAgICBUaGUgYmFzZSBPSUQgZm9yIHRoZSBzeXNPYmplY3RJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHN5c3RlbSBncm91cAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgLjEuMy42LjEuNC4xLjgwNzIuMy4yLi4uID0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldFNubXBBZ2VudE9JRHMuLi4iKV0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBiYXNlIE9JRCB2YWx1ZSBdKTsKICBmaQogIHN5c19vaWQ9YGVjaG8gIiR3aXRodmFsIiB8IHNlZCAncy9eXC4vLycgfCBzZWQgJ3MvXC4vXCwvZydgCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfU1lTVEVNX01JQiwgJHN5c19vaWQpCiAgc3lzX2RvdF9vaWQ9YGVjaG8gIiR3aXRodmFsIiB8IHNlZCAncy9eXC4vLydgCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfU1lTVEVNX0RPVF9NSUIsICRzeXNfZG90X29pZCkKICBzeXNvaWRfbGVuPWBlY2hvICIkd2l0aHZhbCIgfCBzZWQgJ3MvW15cLl0vL2cnIHwgYXdrIC1GXC4gJ3sgcHJpbnQgTkYgfSdgCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfU1lTVEVNX0RPVF9NSUJfTEVOR1RILCAkc3lzb2lkX2xlbikKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGVudGVycHJpc2Ugc3lzT0lEICR3aXRodmFsIC4uLi4pCl0sWwogIEFDX01TR19SRVNVTFQodXNpbmcgZGVmYXVsdCBlbnRlcnByaXNlIHN5c09JRCAiTkVULVNOTVAtTUlCOjpuZXRTbm1wQWdlbnRPSURzLi4uIikKXSkKQUNfQVJHX0VOQUJMRShlbnRlcnByaXNlLXN5c29pZCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1lbnRlcnByaXNlLXN5c29pZC8tLXdpdGhvdXQtZW50ZXJwcmlzZS1zeXNvaWQgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChlbnRlcnByaXNlLW5vdGlmaWNhdGlvbi1vaWQsClsKICAtLXdpdGgtZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkIFRoZSBPSUQgdXNlZCBmb3IgdGhlIHJvb3Qgb2YKCQkJCSAgICAgZW50ZXJwcmlzZSBzcGVjaWZpYyBub3RpZmljYXRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgLjEuMy42LjEuNC4xLjgwNzIuNCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRTbm1wTm90aWZpY2F0aW9uUHJlZml4IildLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgYmFzZSBPSUQgdmFsdWUgXSk7CiAgZmkKICBub3RpZmljYXRpb25fb2lkPWBlY2hvICIkd2l0aHZhbCIgfCBzZWQgJ3MvXlwuLy8nIHwgc2VkICdzL1wuL1wsL2cnYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX05PVElGSUNBVElPTl9NSUIsICRub3RpZmljYXRpb25fb2lkKQogIG5vdGlmaWNhdGlvbl9kb3Rfb2lkPWBlY2hvICIkd2l0aHZhbCIgfCBzZWQgJ3MvXlwuLy8nYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX05PVElGSUNBVElPTl9ET1RfTUlCLCAkbm90aWZpY2F0aW9uX2RvdF9vaWQpCiAgbm90aWZpY2F0aW9ub2lkX2xlbj1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL1teXC5dLy9nJyB8IGF3ayAtRlwuICd7IHByaW50IE5GIH0nYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX05PVElGSUNBVElPTl9ET1RfTUlCX0xFTkdUSCwgJG5vdGlmaWNhdGlvbm9pZF9sZW4pCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBlbnRlcnByaXNlIG5vdGlmaWNhdGlvbnMgJHdpdGh2YWwpCl0sWwogIEFDX01TR19SRVNVTFQodXNpbmcgZGVmYXVsdCBub3RpZmljYXRpb25zICJORVQtU05NUC1NSUI6Om5ldFNubXBOb3RpZmljYXRpb25zIikKXSkKQUNfQVJHX0VOQUJMRShlbnRlcnByaXNlLW5vdGlmaWNhdGlvbi1vaWQsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkLy0td2l0aG91dC1lbnRlcnByaXNlLW5vdGlmaWNhdGlvbi1vaWQgaW5zdGVhZCBdKSApCiMKIyBDYXRjaCBjb21tb24gbWlzdGFrZXMgaW4gY29uZmlndXJlIG9wdGlvbnMKIwpBQ19BUkdfV0lUSChtaWItbW9kdWxlLCwgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24xLiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgICAgICkKQUNfQVJHX1dJVEgobW9kdWxlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uMy4gVXNlIC0td2l0aC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgobW9kdWxlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbjQuIFVzZSAtLXdpdGgtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChvdXQtbWliLW1vZHVsZSwsQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb241LiBVc2UgLS13aXRoLW91dC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgob3V0LW1vZHVsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb243LiBVc2UgLS13aXRoLW91dC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgob3V0LW1vZHVsZSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbjguIFVzZSAtLXdpdGgtb3V0LW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgKQoKIwojIFBlcmwgc3BlY2lmaWMKIwpBQ19BUkdfV0lUSChwZXJsLW1vZHVsZXMsClsKUGVybDoKICAtLXdpdGgtcGVybC1tb2R1bGVzWz1BUkdTXSAgICAgIEluc3RhbGwgdGhlIHBlcmwgbW9kdWxlcyBhbG9uZyB3aXRoIHRoZSByZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbmV0LXNubXAgdG9vbGtpdC4gIElmIEFSR1MgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhleSdyZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlZmlsZS5QTCBzY3JpcHQuXSxbCiAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCiAgICAgIGluc3RhbGxfcGVybD0ibm8iCiAgICBlbHNlCiAgICAgIGluc3RhbGxfcGVybD0ieWVzIgogICAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgIT0gInllcyI7IHRoZW4KICAgICAgICBQRVJMQVJHUz0iJHdpdGh2YWwiCiAgICAgIGZpCiAgICBmaQpdLCBpbnN0YWxsX3Blcmw9InRyeSIpCgpBQ19BUkdfRU5BQkxFKGVtYmVkZGVkLXBlcmwsClsgIC0tZGlzYWJsZS1lbWJlZGRlZC1wZXJsICAgICAgICAgRGlzYWJsZSBlbWJlZGRlZCBQZXJsIGluIHRoZSBTTk1QIGFnZW50IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25tcHRyYXBkLiBbZW5hYmxlZCBieSBkZWZhdWx0XV0sCiAgICBlbWJlZF9wZXJsPSIkZW5hYmxldmFsIiwgZW1iZWRfcGVybD0idHJ5IikKCkFDX0FSR19FTkFCTEUocGVybC1jYy1jaGVja3MsClsgIC0tZGlzYWJsZS1wZXJsLWNjLWNoZWNrcyAgICAgICAgRGlzYWJsZSBjb25maWd1cmUgY2hlY2tzIGZvciB3aGV0aGVyIFBlcmwncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDIENvbXBpbGVyIGlzIGNvbXBhdGlibGUgd2l0aCBvdXJzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWQgcGVybCBpcyBlbmFibGVkLl0pCgojIENvbW1vbiBwZXJsIG1pc3Rha2VzCkFDX0FSR19FTkFCTEUocGVybC1tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXBlcmwtbW9kdWxlcy8tLXdpdGhvdXQtcGVybC1tb2R1bGVzIGluc3RlYWQgXSkgKQpBQ19BUkdfV0lUSChlbWJlZGRlZC1wZXJsLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtZW1iZWRkZWQtcGVybC8tLWRpc2FibGUtZW1iZWRkZWQtcGVybCBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgocGVybC1jYy1jaGVja3MsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1wZXJsLWNjLWNoZWNrcy8tLWRpc2FibGUtcGVybC1jYy1jaGVja3MgaW5zdGVhZCBdKSApCgoKIwojIFB5dGhvbiBzcGVjaWZpYwojCkFDX0FSR19XSVRIKHB5dGhvbi1tb2R1bGVzLApbClB5dGhvbjoKICAtLXdpdGgtcHl0aG9uLW1vZHVsZXNbPUFSR1NdICAgIEluc3RhbGwgdGhlIHB5dGhvbiBiaW5kaW5ncyBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCBvZiB0aGUgbmV0LXNubXAgdG9vbGtpdC4gIElmIEFSR1MgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhleSdyZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5weSBzY3JpcHQgYXMgYXJndW1lbnRzLl0sWwogICAgaW5zdGFsbF9weXRob249eWVzCiAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgICAgUFlUSE9OQVJHUz0iIgogICAgZWxzZQogICAgICBQWVRIT05BUkdTPSIkd2l0aHZhbCIKICAgIGZpCl0sIGluc3RhbGxfcHl0aG9uPSJubyIpCgojIG90aGVyIGZsYWdzCgpBQ19BUkdfV0lUSChzZXJ2ZXItc2VuZC1idWYsClsKTmV0d29yayBCdWZmZXJzOgogIC0td2l0aC1zZXJ2ZXItc2VuZC1idWZbPUFSR10gICAgVXNlIEFSRyBmb3IgdGhlIGRlZmF1bHQgVURQL1RDUCBzZW5kIGJ1ZmZlciBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgT1MgYnVmZmVyIGZvciBzZXJ2ZXIgc29ja2V0cyB0aGF0IGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCAoc25tcGQsIHNubXB0cmFwZCkuICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgcnVudGltZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQVJHIHNob3VsZCBiZSB0aGUgc2l6ZSBpbiBieXRlc10sWwogICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgcG9zaXRpdmUgbnVtYmVyIGZvciB0aGUgc2VydmVyIHNlbmQgYnVmZmVyIF0pCiAgIGZpCiAgIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfU0VSVkVSX1NFTkRfQlVGLCAkd2l0aHZhbCldLAogICBBQ19NU0dfUkVTVUxUKFt1c2luZyBPUyBkZWZhdWx0IHNlbmQgYnVmZmVyIHNpemUgZm9yIHNlcnZlciBzb2NrZXRzXSkgKQpBQ19BUkdfRU5BQkxFKHNlcnZlci1zZW5kLWJ1ZiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1zZXJ2ZXItc2VuZC1idWYvLS13aXRob3V0LXNlcnZlci1zZW5kLWJ1ZiBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKHNlcnZlci1yZWN2LWJ1ZiwKWyAgLS13aXRoLXNlcnZlci1yZWN2LWJ1Zls9QVJHXSAgICBTaW1pbGFyIGFzIHByZXZpb3VzIG9wdGlvbiwgYnV0IGZvciByZWNlaXZlIGJ1ZmZlcl0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBwb3NpdGl2ZSBudW1iZXIgZm9yIHRoZSBzZXJ2ZXIgcmVjdiBidWZmZXIgXSkKICBmaQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfU0VSVkVSX1JFQ1ZfQlVGLCAkd2l0aHZhbCldLAogIEFDX01TR19SRVNVTFQoW3VzaW5nIE9TIGRlZmF1bHQgcmVjdiBidWZmZXIgc2l6ZSBmb3Igc2VydmVyIHNvY2tldHNdKSApCkFDX0FSR19FTkFCTEUoc2VydmVyLXJlY3YtYnVmLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXNlcnZlci1yZWN2LWJ1Zi8tLXdpdGhvdXQtc2VydmVyLXJlY3YtYnVmIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoY2xpZW50LXNlbmQtYnVmLApbICAtLXdpdGgtY2xpZW50LXNlbmQtYnVmWz1BUkddICAgIFNpbWlsYXIgYXMgcHJldmlvdXMgb3B0aW9ucywgYnV0IGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYnVmZmVyIG9mIGNsaWVudCBzb2NrZXRzXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIHBvc2l0aXZlIG51bWJlciBmb3IgdGhlIGNsaWVudCBzZW5kIGJ1ZmZlciBdKQogIGZpCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfREVGQVVMVF9DTElFTlRfU0VORF9CVUYsICR3aXRodmFsKV0sCiAgQUNfTVNHX1JFU1VMVChbdXNpbmcgT1MgZGVmYXVsdCBzZW5kIGJ1ZmZlciBzaXplIGZvciBjbGllbnQgc29ja2V0c10pICkKQUNfQVJHX0VOQUJMRShjbGllbnQtc2VuZC1idWYsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtY2xpZW50LXNlbmQtYnVmLy0td2l0aG91dC1jbGllbnQtc2VuZC1idWYgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChjbGllbnQtcmVjdi1idWYsClsgIC0td2l0aC1jbGllbnQtcmVjdi1idWZbPUFSR10gICAgU2ltaWxhciBhcyBwcmV2aW91cyBvcHRpb25zLCBidXQgZm9yIHRoZSBzZW5kIGJ1ZmZlcl0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBwb3NpdGl2ZSBudW1iZXIgZm9yIHRoZSBjbGllbnQgcmVjdiBidWZmZXIgXSkKICBmaQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfQ0xJRU5UX1JFQ1ZfQlVGLCAkd2l0aHZhbCldLAogIEFDX01TR19SRVNVTFQoW3VzaW5nIE9TIGRlZmF1bHQgcmVjdiBidWZmZXIgc2l6ZSBmb3IgY2xpZW50IHNvY2tldHNdKSApCkFDX0FSR19FTkFCTEUoY2xpZW50LXJlY3YtYnVmLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWNsaWVudC1yZWN2LWJ1Zi8tLXdpdGhvdXQtY2xpZW50LXJlY3YtYnVmIGluc3RlYWQgXSkgKQoKIwojIG90aGVyd2lzZSBwcm9tcHRlZCBpbmZvcm1hdGlvbgojCkFDX0FSR19XSVRIKGRlZmF1bHRzLApbCk1pc2NlbGxhbmVvdXM6CiAgLS13aXRoLWRlZmF1bHRzICAgICAgICAgVXNlIGRlZmF1bHRzIGZvciBwcm9tcHRlZCB2YWx1ZXMuXSwKICAgIGRlZmF1bHRzPSJ5ZXMiLGRlZmF1bHRzPSJubyIpCkFDX0FSR19FTkFCTEUoZGVmYXVsdHMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZGVmYXVsdHMvLS13aXRob3V0LWRlZmF1bHRzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRSh1Y2Qtc25tcC1jb21wYXRpYmlsaXR5LApbICAtLWVuYWJsZS11Y2Qtc25tcC1jb21wYXRpYmlsaXR5IEluc3RhbGwgdWNkLXNubXAgbG9vay1hbGlrZSBoZWFkZXJzIGFuZCBsaWJzLgpdKQpBQ19BUkdfV0lUSCh1Y2Qtc25tcC1jb21wYXRpYmlsaXR5LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtdWNkLXNubXAtY29tcGF0aWJpbGl0eS8tLWRpc2FibGUtdWNkLXNubXAtY29tcGF0aWJpbGl0eSBpbnN0ZWFkIF0pICkKCiMKIyBzZXR1cCBpbnN0YWxsIHRhcmdldHMKIwppZiB0ZXN0ICJ4JGVuYWJsZV91Y2Rfc25tcF9jb21wYXRpYmlsaXR5IiA9ICJ4eWVzIiA7IHRoZW4JCiAgaW5zdGFsbHVjZGhlYWRlcnM9aW5zdGFsbHVjZGhlYWRlcnMKICBpbnN0YWxsdWNkbGlicz1pbnN0YWxsdWNkbGlicwogIEFDX01TR19DQUNIRV9BREQoVUNELVNOTVAgY29tcGF0YWJpbGl0eTogICAgIGVuYWJsZWQpCmZpCkFDX1NVQlNUKGluc3RhbGx1Y2RoZWFkZXJzKQpBQ19TVUJTVChpbnN0YWxsdWNkbGlicykKCiMgT25seSBkZWZpbmUgaWYgc3BlY2lmaWNhbGx5IGNob3NlbiBhcyAtLXdpdGhvdXQgKGkuZS4sIGRlZmF1bHQgdG8gdHJ1ZSkuIAppZiB0ZXN0ICJ4JHdpdGhfcm9vdF9hY2Nlc3MiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoTkVUU05NUF9OT19ST09UX0FDQ0VTUykKZmkKCiMgT25seSBkZWZpbmUgaWYgc3BlY2lmaWNhbGx5IGNob3NlbiBhcyAtLXdpdGhvdXQgKGkuZS4sIGRlZmF1bHQgdG8gdHJ1ZSkuCmlmIHRlc3QgIngkd2l0aF9rbWVtX3VzYWdlIiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5FVFNOTVBfTk9fS01FTV9VU0FHRSkKZmkKCiMgRGVmaW5lIHVubGVzcyBzcGVjaWZpY2FsbHkgc3VwcHJlc3NlZCAoaS5lLiwgb3B0aW9uIGRlZmF1bHRzIHRvIGZhbHNlKS4gCmlmIHRlc3QgIngkd2l0aF9kdW1teV92YWx1ZXMiICE9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKZmkKCiMgT25seSBkZWZpbmUgaWYgc3BlY2lmaWNhbGx5IGNob3NlbiBhcyAtLXdpdGhvdXQgKGkuZS4sIGRlZmF1bHQgdG8gdHJ1ZSkuIAppZiB0ZXN0ICJ4JHdpdGhfb3BhcXVlX3NwZWNpYWxfdHlwZXMiICE9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUykKZmkKCgojIG92ZXJmbG93IHByb2JsZW1zIHdpdGggaHB1eCdzIHNoCiMgdGFrZW4gZnJvbSBQZXJsJ3MgQ29uZmlndXJlIHNjcmlwdCAKCkFDX01TR19DSEVDS0lORyhbaWYgSSBuZWVkIHRvIGZlZWQgbXlzZWxmIHRvIGtzaF0pCmlmIHRlc3QgLWYgL2hwLXV4IC1hIC1mIC9iaW4va3NoOyB0aGVuCiAgaWYgKFBBVEg9LjsgYWxpYXMgLXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgQUNfTVNHX1JFU1VMVChubykKICBlbHNlCiAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgIGlmIHRlc3QgIngkMSIgPSAieCI7IHRoZW4KICAgICAgZXhlYyAvYmluL2tzaCAkMAogICAgZWxzZQogICAgICBleGVjIC9iaW4va3NoICQwICIkQCIKICAgIGZpCiAgZmkKZWxzZQogIEFDX01TR19SRVNVTFQobm8pCmZpCgppZiB0ZXN0ICJ4JGRldmVsb3BlciIgIT0gInhubyIgLWEgLWYgJHNyY2Rpci9yZW1vdmUtZmlsZXM7IHRoZW4KICAjIHR1cm4gb24gdGhlIGRldmVsb3BlciBmbGFnIHdoZW4gdGFrZW4gZnJvbSBhIENWUyBjaGVja291dCAobm90IGEgcmVsZWFzZSkKICBkZXZlbG9wZXI9InllcyIKZmkKCkFDX0xBTkcoW0NdKQpBQ19QUk9HX0NDCkFDX1BST0dfQ1BQCkxJTktDQz0ke0xJTktDQy0iJENDIn0KQUNfU1VCU1QoTElOS0NDKQpBQ19BSVgKCiMgbGlidG9vbCBzdHVmZiBmb3Igc2hhcmVkL3N0YXRpYyBsaWJyYXJpZXMuCkFDX0xJQlRPT0xfRExPUEVOCkFDX0xJQlRPT0xfV0lOMzJfRExMCkFDX1BST0dfTElCVE9PTApBQ19TVUJTVChMSUJUT09MX0RFUFMpCgojIENoZWNrcyBmb3IgcHJvZ3JhbXMuCkFDX1BST0dfSU5TVEFMTApBQ19QUk9HX0xOX1MKQUNfUFJPR19NQUtFX1NFVApBQ19QUk9HX0VHUkVQCkFDX1BBVEhfUFJPRyhbUFNQUk9HXSxwcykKQUNfUEFUSF9QUk9HKFtQRVJMUFJPR10scGVybCkKQUNfQ0hFQ0tfUFJPR1MoV0hPQU1JLCB3aG9hbWkgbG9nbmFtZSwgd2hvYW1pKQpBQ19DSEVDS19QUk9HUyhTRUQsc2VkIGdzZWQpCkFDX0NIRUNLX1BST0dTKEZJTkQsZmluZCkKQUNfUEFUSF9QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKQUNfUEFUSF9QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCmlmIHRlc3QgIngkYWNfY3ZfcHJvZ19BVVRPQ09ORiIgPSAieCI7IHRoZW4KCUFVVE9DT05GPSI6IgoJQUNfU1VCU1QoQVVUT0NPTkYpCmZpCmlmIHRlc3QgIngkYWNfY3ZfcHJvZ19BVVRPSEVBREVSIiA9ICJ4IjsgdGhlbgoJQVVUT0hFQURFUj0iOiIKCUFDX1NVQlNUKEFVVE9IRUFERVIpCmZpCgpBQ19QQVRIX1BST0coW1VOQU1FUFJPR10sdW5hbWUpCkFDX0RFRklORV9VTlFVT1RFRChVTkFNRVBST0csIiRVTkFNRVBST0ciKQoKQUNfQ19DT05TVApBQ19DX0lOTElORQoKCiMgZ2V0IHZlcnNpb24gbnVtYmVyLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBuZXQtc25tcCB2ZXJzaW9uIG51bWJlcl0pClZFUlNJT049YGdyZXAgTmV0U25tcFZlcnNpb25JbmZvLio9ICRzcmNkaXIvc25tcGxpYi9zbm1wX3ZlcnNpb24uYyB8IHNlZCAncy8iOy4qLy87cy8uKiIvLzsnYAoKIyBjcmVhdGUgdGhlIHJlbGVhc2UgdmVyc2lvbiBudW1iZXIuLi4uICBJJ20gbm90IHN1cmUgdGhpcyBpcyB1c2VkCiMgYW55d2hlcmUgYW55IGxvbmdlci4KX3JlbGVhc2VfdmVyc2lvbj1gZWNobyAkVkVSU0lPTiB8IHNlZCAncy8iOy4qLy87cy8uKiIvLztzL3ByZS8wLi87J2AKY2hhbmdlcXVvdGUoLCApClJFTEVBU0VWRVJTSU9OPWBlY2hvICRfcmVsZWFzZV92ZXJzaW9uIHwgc2VkICdzL15cKFswLTldXClcLlwoWzAtOV1cKS9cMTpcMjowLydgCmNoYW5nZXF1b3RlKFssIF0pCgpBQ19TVUJTVChWRVJTSU9OKQpBQ19TVUJTVChSRUxFQVNFVkVSU0lPTikKQUNfTVNHX1JFU1VMVCgkVkVSU0lPTikKQUNfTVNHX0NBQ0hFX0FERChOZXQtU05NUCBWZXJzaW9uOiAgICAgICAgICAgJFZFUlNJT04pCgojIHN1cGVyIHR5cGUgY2hlY2tpbmcKIyBXV1dYWFgKQUNfTVNHX0NIRUNLSU5HKFtmb3IgZGV2ZWxvcGVyIGdjYyBmbGFnc10pCmlmIHRlc3QgIngkZGV2ZWxvcGVyIiA9ICJ4eWVzIiAtYSAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCiAgREVWRkxBR1M9Ii1XYWxsIC1XaW5saW5lIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVd3cml0ZS1zdHJpbmdzIC1XY2FzdC1xdWFsIC1Xbm8tY2hhci1zdWJzY3JpcHRzIgplbHNlCiAgREVWRkxBR1M9IiIKZmkKQUNfTVNHX1JFU1VMVCgkREVWRkxBR1MpCkFDX1NVQlNUKERFVkZMQUdTKQoKIwojIGhhY2tzIGZvciBidWlsZGluZyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5CiMKIyAxKSBtYWtlIHN1cmUgYnVpbGQgaW5jbHVkZSBwYXRocyBhcmUgYmVmb3JlIHNvdXJjZQojIDIpIGNoZWNrIGZvciBHTlUgbWFrZSB0byB1c2UgdnBhdGggaW5zdGVhZCBvZiBWUEFUSAojCk5PTl9HTlVfVlBBVEg9IlZQQVRIID0iCkdOVV92cGF0aD0iI3ZwYXRoIgojCiMgZGVmaW5lIGluY2x1ZGUgcGF0aHMgcmVsYXRpdmUgdG8gdG9wX3NyY2RpcgojIHR3ZWFrIGluY2x1ZGVzIGlmIHdlJ3JlIGJ1aWxkaW5nIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBkaXIKaWYgdGVzdCAieCRzcmNkaXIiID0gInguIjsgdGhlbgpUT1BfSU5DTFVERVM9U1JDX1RPUF9JTkNMVURFUwpTTk1QTElCX0lOQ0xVREVTPVNSQ19TTk1QTElCX0lOQ0xVREVTCkFHRU5UX0lOQ0xVREVTPVNSQ19BR0VOVF9JTkNMVURFUwpIRUxQRVJfSU5DTFVERVM9U1JDX0hFTFBFUl9JTkNMVURFUwpNSUJHUk9VUF9JTkNMVURFUz1TUkNfTUlCR1JPVVBfSU5DTFVERVMKZWxzZQpUT1BfSU5DTFVERVM9QkxEX1RPUF9JTkNMVURFUwpTTk1QTElCX0lOQ0xVREVTPUJMRF9TTk1QTElCX0lOQ0xVREVTCkFHRU5UX0lOQ0xVREVTPUJMRF9BR0VOVF9JTkNMVURFUwpIRUxQRVJfSU5DTFVERVM9QkxEX0hFTFBFUl9JTkNMVURFUwpNSUJHUk9VUF9JTkNMVURFUz1CTERfTUlCR1JPVVBfSU5DTFVERVMKbWFrZSAtdiAtZiAvZGV2L251bGwgMj4vZGV2L251bGwgfCBncmVwIEdOVSA+L2Rldi9udWxsCmhhdmVfZ251X21ha2U9JD8KaWYgdGVzdCAkaGF2ZV9nbnVfbWFrZSAtZXEgMCA7IHRoZW4KICAgIE5PTl9HTlVfVlBBVEg9IiNWUEFUSCA9IgogICAgR05VX3ZwYXRoPSJ2cGF0aCIKZmkKZmkKQUNfU1VCU1QoVE9QX0lOQ0xVREVTKQpBQ19TVUJTVChTTk1QTElCX0lOQ0xVREVTKQpBQ19TVUJTVChBR0VOVF9JTkNMVURFUykKQUNfU1VCU1QoSEVMUEVSX0lOQ0xVREVTKQpBQ19TVUJTVChNSUJHUk9VUF9JTkNMVURFUykKQUNfU1VCU1QoR05VX3ZwYXRoKQpBQ19TVUJTVChOT05fR05VX1ZQQVRIKQoKCiMgc3lzdGVtIGNoZWNrCkFDX0NBTk9OSUNBTF9UQVJHRVQKY2hhbmdlcXVvdGUoLCApClBBUlRJQUxUQVJHRVRPUz1gZWNobyAkdGFyZ2V0X29zIHwgc2VkICdzL1stLl9dLiovLydgCmlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMm1zdmMiOyB0aGVuCglDRkxBR1M9IiRDRkxBR1MgLURtaW5ndzMyIgpmaQojICItVSIgZG9lc24ndCB3b3JrIG9uIGFsbCBjb21waWxlcnMsIHNvIG9ubHkgYWRkIGl0IGZvciBnY2MKIyBYWFg6IGlkZWFsbHkgcmVwbGFjZSBieSBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgYSB3b3JraW5nICItVSIKaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCiAgQ0ZMQUdTPSIkQ0ZMQUdTIC1VJFBBUlRJQUxUQVJHRVRPUyAtRCRQQVJUSUFMVEFSR0VUT1M9JFBBUlRJQUxUQVJHRVRPUyIKZWxzZQogIENGTEFHUz0iJENGTEFHUyAtRCRQQVJUSUFMVEFSR0VUT1M9JFBBUlRJQUxUQVJHRVRPUyIKZmkKY2hhbmdlcXVvdGUoWywgXSkKQUNfTVNHX0NBQ0hFX0FERChCdWlsZGluZyBmb3I6ICAgICAgICAgICAgICAgJFBBUlRJQUxUQVJHRVRPUykKCiMgQUlYIGhhcyBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJzCmNhc2UgJHRhcmdldF9vcyBpbgogICAgYWl4KikKICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdXNpbmcgQUlYIGFuZCBpZiB3ZSBzaG91bGQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzXSkKCUFDX01TR19SRVNVTFQoW3llc10pCgllbmFibGVfc2hhcmVkPW5vCiAgICAgICAgOzsKICAgIGRhcndpbjgqKQogICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBkYXJ3aW4gbGQgbWlnaHQgbmVlZCAtZmxhdF9uYW1lc3BhY2VdKQoJaWYgdGVzdCAteiAiJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCI7IHRoZW4KCQlMREZMQUdTPSItZmxhdF9uYW1lc3BhY2UgJExERkxBR1MiCgkJQUNfTVNHX1JFU1VMVChbeWVzXSkKCWVsc2UKCQlBQ19NU0dfUkVTVUxUKFtub10pCglmaQoJOzsKICAgICopCiAgICAgICAgOzsKZXNhYwoKIwojIGNoZWNrIGZvciBzcGVjaWFsIGluY2x1ZGVzIGFuZCBwaWNrIG9uZQojCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzeXN0ZW0gaW5jbHVkZSBmaWxlXSkKY2hhbmdlcXVvdGUoLCApCmZpbGViYXNlPSR0YXJnZXRfb3MKIyBpZ25vcmUgYmluYXJ5IGZvcm1hdCBpbmRpY2F0aW9uCmZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9lbGYvLydgCmZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9hb3V0Ly8nYApmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvZWNvZmYvLydgCmZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9jb2ZmLy8nYAp3aGlsZSB0ZXN0ICJ4JGZpbGViYXNlIiAhPSAieCRsYXN0IiAtYSAhIC1mICRzcmNkaXIvaW5jbHVkZS9uZXQtc25tcC9zeXN0ZW0vJGZpbGViYXNlLmgKZG8KICAgIGxhc3Q9JGZpbGViYXNlCiAgICBmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvWy0uX11bXi0uX10qJC8vJ2AKICAgIGlmIHRlc3QgIngkZmlsZWJhc2UiID0gIngkbGFzdCI7IHRoZW4KCWZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9bMC05XSokLy8nYAogICAgZmkKZG9uZQoKaWYgdGVzdCAieCRmaWxlYmFzZSIgPSAieCRsYXN0IjsgdGhlbgogICAgZmlsZWJhc2U9ImdlbmVyaWMiCmZpCmFjX2N2X05FVFNOTVBfU1lTVEVNX0lOQ0xVREVfRklMRT0ibmV0LXNubXAvc3lzdGVtLyRmaWxlYmFzZS5oIgoKY2hhbmdlcXVvdGUoWywgXSkKQUNfTVNHX1JFU1VMVCgkYWNfY3ZfTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFKQpBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFLCAiJGFjX2N2X05FVFNOTVBfU1lTVEVNX0lOQ0xVREVfRklMRSIpCgojIHNlY29uZCBwYXJ0LCB0aGUgQ1BVIHR5cGUuCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBtYWNoaW5lLXR5cGUgaW5jbHVkZSBmaWxlXSkKY2hhbmdlcXVvdGUoLCApCmZpbGViYXNlPSR0YXJnZXRfY3B1CndoaWxlIHRlc3QgIngkZmlsZWJhc2UiICE9ICJ4JGxhc3QiIC1hICEgLWYgJHNyY2Rpci9pbmNsdWRlL25ldC1zbm1wL21hY2hpbmUvJGZpbGViYXNlLmgKZG8KICAgIGxhc3Q9JGZpbGViYXNlCiAgICBmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvWy0uX11bXi0uX10qJC8vJ2AKZG9uZQoKaWYgdGVzdCAieCRmaWxlYmFzZSIgPSAieCRsYXN0IjsgdGhlbgogICAgZmlsZWJhc2U9ImdlbmVyaWMiCmZpCmFjX2N2X05FVFNOTVBfTUFDSElORV9JTkNMVURFX0ZJTEU9Im5ldC1zbm1wL21hY2hpbmUvJGZpbGViYXNlLmgiCmNoYW5nZXF1b3RlKFssIF0pCkFDX01TR19SRVNVTFQoWyRhY19jdl9ORVRTTk1QX01BQ0hJTkVfSU5DTFVERV9GSUxFXSkKCkFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX01BQ0hJTkVfSU5DTFVERV9GSUxFLCAiJGFjX2N2X05FVFNOTVBfTUFDSElORV9JTkNMVURFX0ZJTEUiKQoKQUNfUEFUSF9QUk9HKFtDQ1BBVEhdLCRDQykKIyB3YXRjaCBvdXQgZm9yIC91c3IvdWNiL2NjIG9uIHNvbGFyaXMsIGl0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgcGFja2FnZS4KY2FzZSAkdGFyZ2V0X29zIGluCiAgICBic2RpKikKCWlmIHRlc3QgIngkQ0NQQVRIIiA9ICJ4L3Vzci91Y2IvY2MiIC1vICJ4JENDUEFUSCIgPSAieC91c3IvYmluL2NjIjsgdGhlbgoJICAgIEFDX01TR19FUlJPUihbCgoqKiogVGhlIEJTREkgL3Vzci91Y2IvY2MgY29tcGlsZXIgZG9lcyBub3Qgd29yayB3aXRoIHRoaXMgcGFja2FnZS4gIAoqKiogUGxlYXNlIHJ1biBjb25maWd1cmUgd2l0aCAtLXdpdGgtY2M9Z2NjCl0pCglmaQogICAgOzsKICAgIHNvbGFyaXMqKQoJaWYgdGVzdCAieCRDQ1BBVEgiID0gIngvdXNyL3VjYi9jYyI7IHRoZW4KCSAgICBBQ19NU0dfRVJST1IoWwoKKioqIFRoZSBzb2xhcmlzIC91c3IvdWNiL2NjIGNvbXBpbGVyIGRvZXMgbm90IHdvcmsgd2l0aCB0aGlzIHBhY2thZ2UuICAKKioqIFBsZWFzZSBwdXQgYSBkaWZmZXJlbnQgY29tcGlsZXIgaW4geW91ciBwYXRoIGZpcnN0IG9yIHJ1bgoqKiogY29uZmlndXJlIHdpdGggLS13aXRoLWNjPVhYLCB3aGVyZSBYWCBpcyB0aGUgY29tcGlsZXIgeW91IHdhbnQgdG8gdXNlLgpdKQoJZmkKICAgIDs7CmVzYWMKICAgIApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIGNwcCBmbGFnc10pCiMgZ2NjIGV4dHJhIENQUEZMQUdTCmlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIiAtYSAieCRDUFAiID0gIngkQ0MgLUUiOyB0aGVuCiAgIyBleHRyYSBjcHAgZmxhZ3MgZm9yIGdudSBjIGNvbXBpbGVyIHRvIGFsbG93IC5pbiBmaWxlIGV4dGVuc2lvbnMuCiAgRVhUUkFDUFBGTEFHUz0iLXggYyIKZWxzZQogIEVYVFJBQ1BQRkxBR1M9IiIKZmkKCiMgU29sYXJpcyBleHRyYSBjcHAgZmxhZ3MuCmlmIHRlc3QgIngkR0NDIiAhPSAieHllcyI7IHRoZW4KICBjYXNlICR0YXJnZXRfb3MgaW4KICAgIHNvbGFyaXMqKSBFWFRSQUNQUEZMQUdTPSIkRVhUUkFDUFBGTEFHUyAtWHMiIDs7CiAgZXNhYwpmaQoKQUNfU1VCU1QoRVhUUkFDUFBGTEFHUykKQUNfTVNHX1JFU1VMVCgkRVhUUkFDUFBGTEFHUykKCiMgUHJlZml4ZXMgbXVzdCBiZWdpbiB3aXRoICIvIiBvciBbQS1aXSBmb2xsb3dlZCBieSBjb2xvbi4KCmlmIHRlc3QgIngkcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KICBwcmVmaXg9L3Vzci9sb2NhbApmaQoKZmNoPWBlY2hvICRwcmVmaXggfCBzZWQgJ3MvXCguXCkuKi9cMS8nYAppZiB0ZXN0ICJ4JGZjaCIgIT0gIngvIiA7IHRoZW4KICAgc2NoPWBlY2hvICRwcmVmaXggfCBzZWQgJ3MvLlwoLlwpLiovXDEvJ2AKICAgaWYgdGVzdCAieCRzY2giICE9ICJ4OiIgOyB0aGVuCiAgICAgIHByZWZpeD1gcHdkYC8kcHJlZml4CiAgICAgIGVjaG8gImFkanVzdGluZyBwcmVmaXggdG8gJHByZWZpeCIKICAgZmkKZmkKCmlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgogIGV4ZWNfcHJlZml4PSRwcmVmaXgKZmkKCmZjaD1gZWNobyAkZXhlY19wcmVmaXggfCBzZWQgJ3MvXCguXCkuKi9cMS8nYAppZiB0ZXN0ICJ4JGZjaCIgIT0gIngvIiA7IHRoZW4KICAgc2NoPWBlY2hvICRleGVjX3ByZWZpeCB8IHNlZCAncy8uXCguXCkuKi9cMS8nYAogICBpZiB0ZXN0ICJ4JHNjaCIgIT0gIng6IiA7IHRoZW4KICAgICAgZXhlY19wcmVmaXg9YHB3ZGAvJGV4ZWNfcHJlZml4CiAgICAgIGVjaG8gImFkanVzdGluZyBleGVjX3ByZWZpeCB0byAkZXhlY19wcmVmaXgiCiAgIGZpCmZpCgojIFNldCBTTk1QTElCUEFUSCAmIFNOTVBTSEFSRVBBVEgKClNOTVBMSUJQQVRIPSIiCnRtcHNldD0iJGxpYmRpci9zbm1wIgp3aGlsZSB0ZXN0ICJ4JHRtcHNldCIgIT0gIngkU05NUExJQlBBVEgiOyBkbwogIFNOTVBMSUJQQVRIPSIkdG1wc2V0IgogIGV2YWwgdG1wc2V0PSIkdG1wc2V0Igpkb25lCkFDX0RFRklORV9VTlFVT1RFRChTTk1QTElCUEFUSCwiJFNOTVBMSUJQQVRIIikKQUNfU1VCU1QoU05NUExJQlBBVEgpCkFDX0RFRklORV9VTlFVT1RFRChTTk1QRExNT0RQQVRILCIkU05NUExJQlBBVEgvZGxtb2QiKQoKU05NUFNIQVJFUEFUSD0iIgp0bXBzZXQ9IiRkYXRhZGlyL3NubXAiCndoaWxlIHRlc3QgIngkdG1wc2V0IiAhPSAieCRTTk1QU0hBUkVQQVRIIjsgZG8KICBTTk1QU0hBUkVQQVRIPSIkdG1wc2V0IgogIGV2YWwgdG1wc2V0PSIkdG1wc2V0Igpkb25lCkFDX0RFRklORV9VTlFVT1RFRChTTk1QU0hBUkVQQVRILCIkU05NUFNIQVJFUEFUSCIpCkFDX1NVQlNUKFNOTVBTSEFSRVBBVEgpCgppZiB0ZXN0ICJ4JE5FVFNOTVBfREVGQVVMVF9NSUJESVJTIiA9ICJ4IjsgdGhlbgogIE5FVFNOTVBfREVGQVVMVF9NSUJESVJTPSJcJEhPTUUvLnNubXAvbWliczokU05NUFNIQVJFUEFUSC9taWJzIgogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfTUlCRElSUywiJE5FVFNOTVBfREVGQVVMVF9NSUJESVJTIikKZmkKQUNfU1VCU1QoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpCgpTTk1QQ09ORlBBVEg9IiIKdG1wc2V0PSIkc3lzY29uZmRpci9zbm1wIgp3aGlsZSB0ZXN0ICJ4JHRtcHNldCIgIT0gIngkU05NUENPTkZQQVRIIjsgZG8KICBTTk1QQ09ORlBBVEg9IiR0bXBzZXQiCiAgZXZhbCB0bXBzZXQ9IiR0bXBzZXQiCmRvbmUKQUNfREVGSU5FX1VOUVVPVEVEKFNOTVBDT05GUEFUSCwiJFNOTVBDT05GUEFUSCIpCkFDX1NVQlNUKFNOTVBDT05GUEFUSCkKCkFDX0NIRUNLX1NJWkVPRihzaG9ydCkKQUNfQ0hFQ0tfU0laRU9GKGludCkKQUNfQ0hFQ0tfU0laRU9GKGxvbmcpCkFDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcpCkFDX0NIRUNLX1RZUEVTKFtpbnQzMl90LCB1aW50MzJfdCwgdV9pbnQzMl90XSkKQUNfQ0hFQ0tfVFlQRVMoW2ludDY0X3QsIHVpbnQ2NF90LCB1X2ludDY0X3RdKQpBQ19DSEVDS19UWVBFUyhbb2ZmNjRfdF0pCkFDX0NIRUNLX1RZUEVTKFt1aW50cHRyX3QsIGludHB0cl90XSkKCiMgc29sYXJpcyBzcGVjaWZpYyB0eXBlCkFDX0NIRUNLX1RZUEVTKFtDb3VudGVyNjRdLCwsWyNpbmNsdWRlIDxpbmV0L21pYjIuaD5dKQoKIyBndWVzcyBJUHY2IHN0YWNrIHR5cGUuCmlmIHRlc3QgIngkZW5hYmxlX2lwdjYiID0gInh5ZXMiOyB0aGVuCgl2NnR5cGU9dW5rbm93bgoJdjZsaWI9bm9uZQoJdjZ0cnlsaWJjPW5vCgoJQUNfTVNHX0NIRUNLSU5HKFtbaXB2NiBzdGFjayB0eXBlXV0pCglmb3IgaSBpbiB2NmQgdG9zaGliYSBrYW1lIGlucmlhIHpldGEgbGludXgtZ2xpYmMgbGludXgtaW5ldDYgZ2VuZXJpYzsgZG8KCQljYXNlICRpIGluCgkJdjZkKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDwvdXNyL2xvY2FsL3Y2L2luY2x1ZGUvc3lzL3R5cGVzLmg+CiNpZmRlZiBfX1Y2RF9fCnllcwojZW5kaWZdLAoJCQkJW3Y2dHlwZT0kaTsgdjZsaWI9djY7CgkJCQl2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKCQkJCUNGTEFHUz0iLUkvdXNyL2xvY2FsL3Y2L2luY2x1ZGUgJENGTEFHUyJdKQoJCQk7OwoJCXRvc2hpYmEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaWZkZWYgX1RPU0hJQkFfSU5FVDYKeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOyB2NmxpYj1pbmV0NjsKCQkJCXY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWthbWUpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2lmZGVmIF9fS0FNRV9fCnllcwojZW5kaWZdLAoJCQkJW3Y2dHlwZT0kaTsgdjZsaWI9aW5ldDY7CgkJCQl2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKCQkJCXY2dHJ5bGliYz15ZXM7CgkJCQlDRkxBR1M9Ii1ETkVUU05NUF9FTkFCTEVfSVBWNiAkQ0ZMQUdTIl0pCgkJCTs7CgkJaW5yaWEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2lmZGVmIElQVjZfSU5SSUFfVkVSU0lPTgp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7CgkJCQl2NmxpYj1kdW1teTsKCQkJCXY2bGliZGlyPW5vbmU7CgkJCQl2NnRyeWxpYmM9eWVzOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCXpldGEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaWZkZWYgX1pFVEFfTUlOQU1JX0lORVQ2CkEKeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOyB2NmxpYj1pbmV0NjsKCQkJCXY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWxpbnV4LWdsaWJjKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDxmZWF0dXJlcy5oPgojaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICgoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDXyA+IDIpKQp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7CgkJCQl2NmxpYj1kdW1teTsKCQkJCXY2bGliZGlyPW5vbmU7CgkJCQl2NnRyeWxpYmM9eWVzOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWxpbnV4LWluZXQ2KQoJCQlpZiB0ZXN0IC1kIC91c3IvaW5ldDY7IHRoZW4KCQkJCXY2dHlwZT0kaQoJCQkJdjZsaWI9aW5ldDYKCQkJCXY2bGliZGlyPS91c3IvaW5ldDYvbGliCgkJCQlDRkxBR1M9Ii1ETkVUU05NUF9FTkFCTEVfSVBWNiAkQ0ZMQUdTIgoJCQlmaQoJCQk7OwoJCWdlbmVyaWMpCiAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW1twb3N0cG9uZWRdXSkKCQkJQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpdLCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkciwgbm8pCgkgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtbaXB2NiBzdGFjayB0eXBlXV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X3NvY2thZGRyX2luNl9oYXNfc2luNl9hZGRyIiA9ICJ4eWVzIjsgdGhlbgoJCQkJdjZ0eXBlPSRpCgkJCQl2NmxpYj1kdW1teQoJCQkJdjZsaWJkaXI9bm9uZQoJCQkJdjZ0cnlsaWJjPXllcwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyIKICAgICAgICAgICAgICAgICAgICAgICAgZmkKCQkJOzsKCQllc2FjCgkJaWYgdGVzdCAiJHY2dHlwZSIgIT0gInVua25vd24iOyB0aGVuCgkJCWJyZWFrCgkJZmkKCWRvbmUKCglpZiB0ZXN0ICIkdjZsaWIiICE9ICJub25lIjsgdGhlbgoJCWlmIHRlc3QgLWQgJHY2bGliZGlyIC1hIC1mICR2NmxpYmRpci9saWIkdjZsaWIuYTsgdGhlbgoJCQlMSUJTPSItTCR2NmxpYmRpciAtbCR2NmxpYiAkTElCUyIKCQkJZW5hYmxlX2lwdjY9InllcyIKCQkJQUNfTVNHX1JFU1VMVChbIiR2NnR5cGUsICRlbmFibGVfaXB2NiwgdXNpbmcgbGliJHY2bGliIl0pCgkJZWxpZiB0ZXN0ICIkdjZ0cnlsaWJjIiA9ICJ5ZXMiOyB0aGVuCgkJCWVuYWJsZV9pcHY2PSJ5ZXMiCgkJCUFDX01TR19SRVNVTFQoWyIkdjZ0eXBlLCAkZW5hYmxlX2lwdjYsIHVzaW5nIGxpYmMiXSkKCQllbHNlCgkJCUFDX01TR19FUlJPUihubyBJUHY2IGxpYnJhcnkgbGliJHY2bGliLmEgZm91bmQuKQoJCQlleGl0IDEKCQlmaQoJZWxzZQoJCWVuYWJsZV9pcHY2PSJubyIKCQlBQ19NU0dfUkVTVUxUKFsiJHY2dHlwZSwgJGVuYWJsZV9pcHY2Il0pCglmaQpmaQoKIwojIE1heWJlIGFkZCBsaWJyYXJ5IGV4dGVuc2lvbnMgZm9yIHRocmVhZCBtdXRleCBsb2NraW5nLgojCgppZiB0ZXN0ICJ4JHdpdGhfcmVzX2xvY2tzIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX1JFRU5UUkFOVCkKCiAgICBjYXNlICR0YXJnZXRfb3MgaW4KCiAgICBhaXgqKQoJQ0NfUlVOVElNRV9BUkc9IiRDQ19SVU5USU1FX0FSRyAtbHB0aHJlYWRzIgoJOzsKCiAgICAqKQoJOzsKCiAgICBlc2FjCmZpCgojCiMgQWRkIHBsYXRmb3JtLXNwZWNpZmljIHNvdXJjZSBmaWxlcy4KIwpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwbGF0Zm9ybS1zcGVjaWZpYyBzb3VyY2VdKQpvdGhlcl9zcmNfbGlzdD0iIgpvdGhlcl9vYmpzX2xpc3Q9IiIKb3RoZXJfbG9ianNfbGlzdD0iIgpvdGhlcl9hZ2VudG9ianM9IiIKb3RoZXJfbGFnZW50b2Jqcz0iIgpvdGhlcl90cmFwZF9vYmplY3RzPSIiCgojIFdpbjMyIHNlcnZpY2UgY29kZQppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgb3RoZXJfc3JjX2xpc3Q9IiRvdGhlcl9zcmNfbGlzdCB3aW5zZXJ2aWNlLmMgd2luc2VydmljZXJjLnJjIgogIG90aGVyX29ianNfbGlzdD0iJG90aGVyX29ianNfbGlzdCB3aW5zZXJ2aWNlLm8gd2luc2VydmljZXJjLm8iCiAgb3RoZXJfbG9ianNfbGlzdD0iJG90aGVyX2xvYmpzX2xpc3Qgd2luc2VydmljZS5sbyB3aW5zZXJ2aWNlcmMubG8iCiAgb3RoZXJfYWdlbnRvYmpzPSIuLi9zbm1wbGliL3dpbnNlcnZpY2VyYy5vIgogIG90aGVyX2xhZ2VudG9ianM9Ii4uL3NubXBsaWIvd2luc2VydmljZXJjLmxvIgogIG90aGVyX3RyYXBkX29iamVjdHM9Ii4uL3NubXBsaWIvd2luc2VydmljZXJjLm8iIApmaQogIAojIFdpbjMyIHBpcGVzCmlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMiIgLW8gIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMm1zdmMiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieGN5Z3dpbiI7IHRoZW4KICBvdGhlcl9zcmNfbGlzdD0iJG90aGVyX3NyY19saXN0IHdpbnBpcGUuYyIKICBvdGhlcl9vYmpzX2xpc3Q9IiRvdGhlcl9vYmpzX2xpc3Qgd2lucGlwZS5vIgogIG90aGVyX2xvYmpzX2xpc3Q9IiRvdGhlcl9sb2Jqc19saXN0IHdpbnBpcGUubG8iCmZpCgpBQ19TVUJTVChvdGhlcl9zcmNfbGlzdCkKQUNfU1VCU1Qob3RoZXJfb2Jqc19saXN0KQpBQ19TVUJTVChvdGhlcl9sb2Jqc19saXN0KQpBQ19TVUJTVChvdGhlcl9hZ2VudG9ianMpCkFDX1NVQlNUKG90aGVyX2xhZ2VudG9ianMpCkFDX1NVQlNUKG90aGVyX3RyYXBkX29iamVjdHMpCgpBQ19NU0dfUkVTVUxUKFskb3RoZXJfc3JjX2xpc3QgJG90aGVyX29ianNfbGlzdCAkb3RoZXJfbG9ianNfbGlzdF0pCkFDX01TR19SRVNVTFQoWyRvdGhlcl9hZ2VudG9ianMgJG90aGVyX2xhZ2VudG9ianMgJG90aGVyX3RyYXBkX29iamVjdHNdKQogIAojCiMgRG8gdHJhbnNwb3J0IG1vZHVsZSBwcm9jZXNzaW5nLgojCkFDX01TR19DSEVDS0lORyhbZm9yIGFuZCBjb25maWd1cmluZyB0cmFuc3BvcnQgbW9kdWxlcyB0byB1c2VdKQp0cmFuc3BvcnRfc3JjX2xpc3Q9IiIKdHJhbnNwb3J0X2hkcl9saXN0PSIiCnRyYW5zcG9ydF9kZWZfbGlzdD0iIgp0cmFuc3BvcnRfcmVzdWx0X2xpc3Q9IiIKdHJhbnNwb3J0X2FkZF9saXN0PSIiCnRyYW5zcG9ydF9jYWxsYmFja19kaXNhYmxlZD0iIgpuZXdfd2l0aF90cmFuc3BvcnRfbGlzdD1gZWNobyAkd2l0aF90cmFuc3BvcnRzIHwgc2VkICdzLywvIC9nOydgCm5ld193aXRoX291dF90cmFuc3BvcnRfbGlzdD1gZWNobyAkd2l0aF9vdXRfdHJhbnNwb3J0cyB8IHNlZCAncy8sLyAvZzsnYAoKIwojIEFkZCB0aGUgZGVmYXVsdCB0cmFuc3BvcnRzIHRvIHRoZSBsaXN0CiMKaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgdHJhbnNwb3J0X2RlZmF1bHRfbGlzdD0iVURQIFRDUCBDYWxsYmFjayIKZWxpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbiAKICB0cmFuc3BvcnRfZGVmYXVsdF9saXN0PSJVRFAgVENQIENhbGxiYWNrIgplbHNlCiAgdHJhbnNwb3J0X2RlZmF1bHRfbGlzdD0iVURQIFRDUCBVbml4IENhbGxiYWNrIgpmaQppZiB0ZXN0ICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgogIHRyYW5zcG9ydF9kZWZhdWx0X2xpc3Q9IlVEUElQdjYgVENQSVB2NiAkdHJhbnNwb3J0X2RlZmF1bHRfbGlzdCIKZmkKZm9yIGkgaW4gJHRyYW5zcG9ydF9kZWZhdWx0X2xpc3Q7IGRvCiAgaWYgZWNobyAiICRuZXdfd2l0aF90cmFuc3BvcnRfbGlzdCAiIHwgZ3JlcCAiICRpICIgPi9kZXYvbnVsbDsgdGhlbgogICAgOgogIGVsc2UKICAgIHRyYW5zcG9ydF9hZGRfbGlzdD0iJGkgJHRyYW5zcG9ydF9hZGRfbGlzdCIKICBmaQpkb25lCm5ld190cmFuc3BvcnRfbGlzdD0iJHRyYW5zcG9ydF9hZGRfbGlzdCAkbmV3X3dpdGhfdHJhbnNwb3J0X2xpc3QiCgpmb3IgaSBpbiAkbmV3X3RyYW5zcG9ydF9saXN0OyBkbwogIGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X3RyYW5zcG9ydF9saXN0ICIgfCBncmVwICIgJGkgIiA+L2Rldi9udWxsOyB0aGVuCiAgICBpZiB0ZXN0ICJ4JGkiID0gInhVRFAiOyB0aGVuCiAgICAgIGVjaG8KICAgICAgQUNfTVNHX0VSUk9SKEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjb21waWxlIHdpdGhvdXQgVURQL0lQIHN1cHBvcnQuKQogICAgZWxpZiB0ZXN0ICJ4JGkiID0gInhDYWxsYmFjayI7IHRoZW4KICAgICAgZWNobwogICAgICB0cmFuc3BvcnRfY2FsbGJhY2tfZGlzYWJsZWQ9InllcyIKICAgIGZpCiAgZWxzZQogICAgaWYgdGVzdCAieCRpIiA9ICJ4QUFMNVBWQyI7IHRoZW4KICAgICAgaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiICE9ICJ4bGludXgiOyB0aGVuCiAgICAgICAgZWNobwogICAgICAgIEFDX01TR19FUlJPUihBQUw1IFBWQyBzdXBwb3J0IHVuYXZhaWxhYmxlIGZvciB0aGlzIHBsYXRmb3JtIChMaW51eCBvbmx5KSkKICAgICAgZmkKICAgIGZpCiAgICBpZiB0ZXN0ICJ4JGkiID0gInhJUFgiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiAhPSAieGxpbnV4IjsgdGhlbgogICAgICAgIGVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoSVBYIHN1cHBvcnQgdW5hdmFpbGFibGUgZm9yIHRoaXMgcGxhdGZvcm0gKExpbnV4IG9ubHkpKQogICAgICBmaQogICAgZmkKICAgIGlmIHRlc3QgIngkaSIgPSAieFVuaXgiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4Y3lnd2luIjsgdGhlbgogICAgICAgIGVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoVW5peCBkb21haW4gcHJvdG9jb2wgc3VwcG9ydCB1bmF2YWlsYWJsZSBmb3IgdGhpcyBwbGF0Zm9ybSkKICAgICAgZWxpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbgogICAgICAgIGVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoVW5peCBkb21haW4gcHJvdG9jb2wgc3VwcG9ydCB1bmF2YWlsYWJsZSBmb3IgdGhpcyBwbGF0Zm9ybSkKICAgICAgZmkKICAgIGZpCiAgICBpZiB0ZXN0ICEgIngkZW5hYmxlX2lwdjYiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgaWYgdGVzdCAieCRpIiA9ICJ4VURQSVB2NiIgLW8gIngkaSIgPSAieFRDUElQdjYiOyB0aGVuCiAgICAgICAgICAgIGVjaG8KICAgICAgICAgICAgQUNfTVNHX0VSUk9SKElQdjYgdHJhbnNwb3J0cyBub3QgYXZhaWxhYmxlIGlmIElQdjYgc3VwcG9ydCBpcyBub3QgZW5hYmxlZCkKICAgICAgICBmaQogICAgZmkKICAgIHRyYW5zcG9ydF9zcmM9InNubXAiJGkiRG9tYWluLmMiCiAgICB0cmFuc3BvcnRfaGRyPSJzbm1wIiRpIkRvbWFpbi5oIgogICAgcmVsX3RyYW5zcG9ydF9zcmM9InNubXBsaWIvIiR0cmFuc3BvcnRfc3JjCiAgICByZWxfdHJhbnNwb3J0X2hkcj0iaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5LyIkdHJhbnNwb3J0X2hkcgogICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kcmVsX3RyYW5zcG9ydF9zcmMiOyB0aGVuCiAgICAgIHRyYW5zcG9ydF9yZXN1bHRfbGlzdD0iJHRyYW5zcG9ydF9yZXN1bHRfbGlzdCAkaSIKICAgICAgdHJhbnNwb3J0X3NyY19saXN0PSIkdHJhbnNwb3J0X3NyYyAkdHJhbnNwb3J0X3NyY19saXN0IgogICAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRyZWxfdHJhbnNwb3J0X2hkciI7IHRoZW4KICAgICAgICB0cmFuc3BvcnRfaGRyX2xpc3Q9IiR0cmFuc3BvcnRfaGRyICR0cmFuc3BvcnRfaGRyX2xpc3QiCiAgICAgIGZpCiAgICAgIHRyYW5zcG9ydF9kZWY9YGVjaG8gJGkgfCBzZWQgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKICAgICAgdHJhbnNwb3J0X2RlZl9saXN0PSJORVRTTk1QX1RSQU5TUE9SVF8iJHRyYW5zcG9ydF9kZWYiX0RPTUFJTiAkdHJhbnNwb3J0X2RlZl9saXN0IgogICAgZWxzZQogICAgICBlY2hvCiAgICAgIEFDX01TR19FUlJPUihDYW5ub3QgZmluZCBmaWxlICRzcmNkaXIvJHJlbF90cmFuc3BvcnRfc3JjIHRvIHN1cHBvcnQgU05NUCB0cmFuc3BvcnQgZG9tYWluICRpLikKICAgIGZpCiAgZmkKZG9uZQp0cmFuc3BvcnRfb2JqX2xpc3Q9YGVjaG8gIiAkdHJhbnNwb3J0X3NyY19saXN0ICIgfCBzZWQgJ3MvXC5jL1wuby9nJ2AgCSAKdHJhbnNwb3J0X2xvYmpfbGlzdD1gZWNobyAiICR0cmFuc3BvcnRfc3JjX2xpc3QgIiB8IHNlZCAncy9cLmMvXC5sby9nJ2AKCiMjIHdpbjMyIHBsYXRmb3JtcyByZXF1aXJlIGluZXRfbnRvcCBldGMuCmlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMiIgLW8gIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMm1zdmMiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieGN5Z3dpbiI7IHRoZW4KICBpZiBlY2hvICIkdHJhbnNwb3J0X2RlZl9saXN0IiB8IGdyZXAgIklQVjYiID4vZGV2L251bGw7IHRoZW4KICAgIHRyYW5zcG9ydF9vYmpfbGlzdD0iJHRyYW5zcG9ydF9vYmpfbGlzdCBpbmV0X250b3AubyBpbmV0X3B0b24ubyIKICAgIHRyYW5zcG9ydF9sb2JqX2xpc3Q9IiR0cmFuc3BvcnRfbG9ial9saXN0IGluZXRfbnRvcC5sbyBpbmV0X3B0b24ubG8iCiAgZmkKZmkKCkFDX1NVQlNUKHRyYW5zcG9ydF9oZHJfbGlzdCkKQUNfU1VCU1QodHJhbnNwb3J0X3NyY19saXN0KQpBQ19TVUJTVCh0cmFuc3BvcnRfb2JqX2xpc3QpCkFDX1NVQlNUKHRyYW5zcG9ydF9sb2JqX2xpc3QpCmZvciBpIGluICR0cmFuc3BvcnRfZGVmX2xpc3Q7IGRvCiAgQUNfREVGSU5FX1VOUVVPVEVEKCRpKQpkb25lCkFDX01TR19SRVNVTFQoJHRyYW5zcG9ydF9yZXN1bHRfbGlzdC4pCkFDX01TR19DQUNIRV9BREQoTmV0d29yayB0cmFuc3BvcnQgc3VwcG9ydDogJHRyYW5zcG9ydF9yZXN1bHRfbGlzdCkKCiMKIyBTZWN1cml0eSBtb2R1bGVzIHRvIHVzZQojIAoKQUNfTVNHX0NIRUNLSU5HKFtmb3Igc2VjdXJpdHkgbW9kdWxlcyB0byB1c2VdKQpzZWN1cml0eV9kZWZfbGlzdD0idXNtIgpzZWN1cml0eV9zcmNfbGlzdD0iIgpzZWN1cml0eV9vYmpfbGlzdD0iIiAJIApzZWN1cml0eV9sb2JqX2xpc3Q9IiIKc2VjdXJpdHlfaW5pdF9maWxlPSJzbm1wbGliL3NubXBzbV9pbml0LmgiCnNlY3VyaXR5X2luY2xfZmlsZT0iaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5L3NubXB2My1zZWN1cml0eS1pbmNsdWRlcy5oIgpuZXdfd2l0aF9zZWN1cml0eT1gZWNobyAkd2l0aF9zZWN1cml0eV9tb2R1bGVzIHwgc2VkICdzLywvIC9nOydgCm5ld193aXRoX291dF9zZWN1cml0eT1gZWNobyAkd2l0aF9vdXRfc2VjdXJpdHlfbW9kdWxlcyB8IHNlZCAncy8sLyAvZzsnYAoKaWYgdGVzdCAhIC1kIGluY2x1ZGU7IHRoZW4KICBta2RpciBpbmNsdWRlCmZpCmlmIHRlc3QgISAtZCBpbmNsdWRlL25ldC1zbm1wOyB0aGVuCiAgbWtkaXIgaW5jbHVkZS9uZXQtc25tcApmaQppZiB0ZXN0ICEgLWQgaW5jbHVkZS9uZXQtc25tcC9hZ2VudDsgdGhlbgogIG1rZGlyIGluY2x1ZGUvbmV0LXNubXAvYWdlbnQKZmkKaWYgdGVzdCAhIC1kIGluY2x1ZGUvbmV0LXNubXAvbGlicmFyeTsgdGhlbgogIG1rZGlyIGluY2x1ZGUvbmV0LXNubXAvbGlicmFyeQpmaQppZiB0ZXN0ICEgLWQgaW5jbHVkZS91Y2Qtc25tcDsgdGhlbgogIG1rZGlyIGluY2x1ZGUvdWNkLXNubXAKZmkKCmlmIHRlc3QgISAtZCBzbm1wbGliOyB0aGVuCiAgbWtkaXIgc25tcGxpYgpmaQplY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgRG8gbm90IG1vZGlmeSBieSBoYW5kLiAqLyIgPiAkc2VjdXJpdHlfaW5pdF9maWxlCmVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuICBEbyBub3QgbW9kaWZ5IGJ5IGhhbmQuICovIiA+ICRzZWN1cml0eV9pbmNsX2ZpbGUKCmZvciBpIGluICRzZWN1cml0eV9kZWZfbGlzdDsgZG8KICBpZiBlY2hvICIgJG5ld193aXRoX291dF9zZWN1cml0eSAiIHwgZ3JlcCAiICRpICIgPiAvZGV2L251bGw7IHRoZW4KICAgIGlmIHRlc3QgIngkaSIgPSAieHVzbSI7IHRoZW4KCWVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoVGhlIFVTTSBzZWN1cml0eSBtb2R1bGUgaXMgbWFuZGF0b3J5KQogICAgZmkKICBlbHNlCiAgICBuZXdfd2l0aF9zZWN1cml0eT0iJG5ld193aXRoX3NlY3VyaXR5ICRpIgogIGZpCmRvbmUKCmZvciBpIGluICRuZXdfd2l0aF9zZWN1cml0eTsgZG8KICBjZmlsZT0ic25tcCIkaSIuYyIKICBoZmlsZT0ic25tcCIkaSIuaCIKCiAgIyBtYWtlIHN1cmUgc3VwcG9ydCBleGlzdHMgZm9yIGl0CiAgaWYgdGVzdCAtZiAkc3JjZGlyIi9zbm1wbGliLyIkY2ZpbGUgLWEgLWYgJHNyY2RpciIvaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5LyIkaGZpbGU7IHRoZW4KICAgIDoKICBlbHNlCiAgICBlY2hvCiAgICBBQ19NU0dfRVJST1IoTm8gc3VjaCBzZWN1cml0eSBtb2R1bGU6ICRpIC8gJGNmaWxlIC8gJGhmaWxlKQogIGZpCgogICMgZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYgdG8gZW5hYmxlIGl0CiAgc2VjdXJpdHlfc3JjX2xpc3Q9IiRzZWN1cml0eV9zcmNfbGlzdCAkY2ZpbGUiCiAgc2VjdXJpdHlfaGRyX2xpc3Q9IiRzZWN1cml0eV9oZHJfbGlzdCAkaGZpbGUiCiAgc2VjdXJpdHlfb2JqX2xpc3Q9IiRzZWN1cml0eV9vYmpfbGlzdCBzbm1wIiRpIi5vIiAJIAogIHNlY3VyaXR5X2xvYmpfbGlzdD0iJHNlY3VyaXR5X2xvYmpfbGlzdCBzbm1wIiRpIi5sbyIKICBkZWZfbmFtZT0iTkVUU05NUF9TRUNNT0RfImBlY2hvICRpIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAogIGVjaG8gImluaXRfIiRpIigpOyIgPj4gJHNlY3VyaXR5X2luaXRfZmlsZQogIGVjaG8gIiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5LyRoZmlsZT4iID4+ICRzZWN1cml0eV9pbmNsX2ZpbGUKICBBQ19ERUZJTkVfVU5RVU9URUQoJGRlZl9uYW1lKQpkb25lCgpBQ19TVUJTVChzZWN1cml0eV9zcmNfbGlzdCkKQUNfU1VCU1Qoc2VjdXJpdHlfaGRyX2xpc3QpCkFDX1NVQlNUKHNlY3VyaXR5X29ial9saXN0KSAJIApBQ19TVUJTVChzZWN1cml0eV9sb2JqX2xpc3QpCkFDX01TR19SRVNVTFQoJG5ld193aXRoX3NlY3VyaXR5KQpBQ19NU0dfQ0FDSEVfQUREKFNOTVB2MyBTZWN1cml0eSBNb2R1bGVzOiAgICAkbmV3X3dpdGhfc2VjdXJpdHkpCgojCiMgSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgS1NNIHRvIHNlZSB3aGljaCBjcnlwdG8gQVBJIHdlIHN1cHBvcnQKIwoKYWNfY3ZfTkVUU05NUF9VU0VfS0VSQkVST1NfTUlUPW5vCnJlYnVpbHRfbmV3X3dpdGhfc2VjdXJpdHk9CmFscmVhZHlfY2hlY2tlZF9rcmI1PW5vCgpmb3Igc2VjIGluICRuZXdfd2l0aF9zZWN1cml0eQpkbwogIGlmIHRlc3QgIngkc2VjIiA9ICJ4a3NtIiAtYSAieHllcyIgPSAieCRhbHJlYWR5X2NoZWNrZWRfa3JiNSI7IHRoZW4KICAgIGNvbnRpbnVlCiAgZmkKICBhbHJlYWR5X2NoZWNrZWRfa3JiNT15ZXMKCiAgaWYgdGVzdCB4JHNlYyAhPSB4a3NtOyB0aGVuCiAgICByZWJ1aWx0X25ld193aXRoX3NlY3VyaXR5PSIkcmVidWlsdF9uZXdfd2l0aF9zZWN1cml0eSAkc2VjIgogIGVsc2UKICAgIGlmIHRlc3Qgbm8gPSAkdHJ5a3JiNTsgdGhlbgogICAgICBBQ19NU0dfTk9USUNFKFtjb25maWd1cmVkIG5vdCB0byB1c2Uga3JiNS4gZGlzYWJsaW5nIGtzbV0pCiAgICAgIGNvbnRpbnVlCiAgICBmaQoKICAgIEFDX1BBVEhfUFJPRyhba3JiNV9jb25maWddLGtyYjUtY29uZmlnLFtub10sJGtyYjVwYXRoL2JpbjokUEFUSCkKCiAgICBpZiB0ZXN0IG5vICE9ICRrcmI1X2NvbmZpZzsgdGhlbgogICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIGAka3JiNV9jb25maWcgLS1jZmxhZ3NgIgogICAgICBMSUJTPSIkTElCUyBgJGtyYjVfY29uZmlnIC0tbGlic2AiCiAgICBlbGlmIHRlc3QgJGtyYjVwYXRoICE9IG5vOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgka3JiNXBhdGgpCiAgICBlbHNlCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgvdXNyL2tlcmJlcm9zKQogICAgZmkKCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBrcmI1XSkKICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9oYXZlX2tyYjUsCiAgICAgIEFDX0NIRUNLX0xJQihrcmI1LCBrcmI1X2luaXRfY29udGV4dCwKCWFjX2N2X2hhdmVfa3JiNT15ZXMsIGFjX2N2X2hhdmVfa3JiNT1ubwogICAgICApCiAgICApCgogICAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9rcmI1ID0gbm87IHRoZW4KICAgICAgaWYgdGVzdCAieCRhc2tlZGtyYjUiID0gInh5ZXMiOyB0aGVuCglBQ19NU0dfRVJST1IoQXNrZWQgdG8gdXNlIGtyYjUgYnV0IEkgY291bGRuJ3QgZmluZCBpdC4pCiAgICAgIGZpCiAgICAgIEFDX01TR19SRVNVTFQobm8uIGRpc2FibGluZyBrc20pCiAgICAgIGNvbnRpbnVlCiAgICBmaQogICAgICAKICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgcmVidWlsdF9uZXdfd2l0aF9zZWN1cml0eT0iJHJlYnVpbHRfbmV3X3dpdGhfc2VjdXJpdHkga3NtIgoKICAgIEFDX01TR19DSEVDS0lORyhbW2ZvciBoZWltZGFsXV0pCiAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfaGVpbWRhbCwKICAgIFtBQ19UUllfQ09NUElMRSgKICAgICAgWyNpbmNsdWRlIDxrcmI1Lmg+XSwKICAgICAgW2NvbnN0IGNoYXIgKnYgPSBoZWltZGFsX3ZlcnNpb247XSwKICAgICAgYWNfY3ZfaGVpbWRhbD15ZXMsCiAgICAgIGFjX2N2X2hlaW1kYWw9bm8KICAgICldKQogICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaGVpbWRhbCkKICAgIGlmIHRlc3QgJGFjX2N2X2hlaW1kYWwgPSB5ZXM7IHRoZW4KICAgICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX0tFUkJFUk9TX0hFSU1EQUwpCiAgICAgIGlmIHRlc3Qgbm8gPSAka3JiNV9jb25maWc7IHRoZW4KCUxJQlM9IiRMSUJTIC1sa3JiNSAtbGFzbjEgLWxjb21fZXJyIC1scm9rZW4iCiAgICAgIGZpCiAgICBlbGlmIHRlc3Qgbm8gPSAka3JiNV9jb25maWc7IHRoZW4KCUxJQlM9IiRMSUJTIC1sa3JiNSAtbGNvbV9lcnIiCiAgICBmaQoKICAgIEFDX01TR19DSEVDS0lORyhbdG8gc2VlIHdoaWNoIGNyeXB0byBBUEkgd2UgbmVlZCB0byB1c2VdKQogICAgQUNfQ0hFQ0tfRlVOQyhrcmI1X2NfZW5jcnlwdCxbCiAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfTkVUU05NUF9VU0VfS0VSQkVST1NfTUlULAogICAgICBBQ19DSEVDS19MSUIoazVjcnlwdG8sIGtyYjVfaW5pdF9jb250ZXh0LAoJYWNfY3ZfTkVUU05NUF9VU0VfS0VSQkVST1NfTUlUPXllcywgYWNfY3ZfTUlUX05FV19DUllQVG89bm8KICAgICAgKQogICAgKQoKICAgIGlmIHRlc3QgeWVzID0gJGFjX2N2X05FVFNOTVBfVVNFX0tFUkJFUk9TX01JVDsgdGhlbgogICAgICBBQ19NU0dfUkVTVUxUKG5ldyBNSVQgY3J5cHRvIEFQSSkKICAgICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX0tFUkJFUk9TX01JVCkKICAgICAgaWYgdGVzdCBubyA9ICRrcmI1X2NvbmZpZzsgdGhlbgoJTElCUz0iJExJQlMgLWxrNWNyeXB0byIKICAgICAgZmkKICAgIGVsc2UKICAgICAgQUNfTVNHX1JFU1VMVChvbGQgTUlUIGNyeXB0byBBUEkpXSkKICAgIGZpCiAgZmkKZG9uZQoKbmV3X3dpdGhfc2VjdXJpdHk9JHJlYnVpbHRfbmV3X3dpdGhfc2VjdXJpdHkKCiMKIyBnZW5lcmF0ZSBlbXB0eSBmaWxlcwojCiMgQ3JlYXRlIGluY2x1ZGUgZmlsZSBsaXN0IGZvciBzbm1wX3ZhcnMuaCB0byB1c2UuCm1pYmRpcj0iYWdlbnQvbWliZ3JvdXAiCmlmIHRlc3QgISAtZCBhZ2VudDsgdGhlbgogIG1rZGlyIGFnZW50CmZpCmlmIHRlc3QgISAtZCBhZ2VudC9taWJncm91cDsgdGhlbgogIG1rZGlyIGFnZW50L21pYmdyb3VwCmZpCmo9IiRtaWJkaXIvbWliX21vZHVsZV9pbmNsdWRlcy5oICAkbWliZGlyL2FnZW50X21vZHVsZV9pbmNsdWRlcy5oIFwKICAgJG1pYmRpci9taWJfbW9kdWxlX2luaXRzLmggICAgICRtaWJkaXIvYWdlbnRfbW9kdWxlX2luaXRzLmggICAgXAogICAkbWliZGlyL21pYl9tb2R1bGVfc2h1dGRvd24uaCAgJG1pYmRpci9hZ2VudF9tb2R1bGVfc2h1dGRvd24uaCBcCiAgIGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvbWliX21vZHVsZV9jb25maWcuaCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvYWdlbnRfbW9kdWxlX2NvbmZpZy5oICAgXAogICAkbWliZGlyL21pYl9tb2R1bGVfZG90X2NvbmYuaCAgJG1pYmRpci9hZ2VudF9tb2R1bGVfZG90X2NvbmYuaCIKCmZvciBpIGluICRqOyBkbwogIHJtIC1mICRpCiAgZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBtb2RpZnkgYnkgaGFuZC4gKi8iID4gJGkKZG9uZQoKIwojIERvIGhhaXJ5IGFnZW50IG1vZHVsZSBwcm9jZXNzaW5nLgojCkFDX01TR19DSEVDS0lORyhbZm9yIGFuZCBjb25maWd1cmluZyBtaWIgbW9kdWxlcyB0byB1c2VdKQoKIyBzZXQgdXAgdGhlIENQUCBjb21tYW5kCk1PRFVMRUNQUD0iJENQUCAtVSRQQVJUSUFMVEFSR0VUT1MgLUQkUEFSVElBTFRBUkdFVE9TPSRQQVJUSUFMVEFSR0VUT1MgLUkke3NyY2Rpcn0vaW5jbHVkZSAtSSR7c3JjZGlyfS9hZ2VudC9taWJncm91cCIKaWYgdGVzdCAieCRlbmFibGVfbWZkX3Jld3JpdGVzIiA9ICJ4eWVzIjsgdGhlbgogIE1PRFVMRUNQUD0iJE1PRFVMRUNQUCAtRE5FVFNOTVBfRU5BQkxFX01GRF9SRVdSSVRFUyIKZmkKCm1vZHVsZV9saXN0PSIiCm1vZHVsZV9saXN0X2NvZGU9IiIKbWliX21vZHVsZV9saXN0PSIiCm1pYl9tb2R1bGVfbGlzdF9jb2RlPSIiCmFnZW50X21vZHVsZV9saXN0PSIiCmFnZW50X21vZHVsZV9saXN0X2NvZGU9IiIKbmV3X3dpdGhfbWliX21vZHVsZXM9YGVjaG8gJHdpdGhfbWliX21vZHVsZXMgfCBzZWQgJ3MvLC8gL2c7J2AKbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzPWBlY2hvICR3aXRoX291dF9taWJfbW9kdWxlcyB8IHNlZCAncy8sLyAvZzsnYAoKIyBzZXQgdXAgaW5pdGlhbCBtb2R1bGUgbGlzdApuZXdfbW9kdWxlX2xpc3Q9IiRuZXdfd2l0aF9taWJfbW9kdWxlcyBkZWZhdWx0X21vZHVsZXMiCgojIG1pbm9yIG1vZGlmaWNhdGlvbnMKaWYgdGVzdCAieCRlbmFibGVfYWdlbnQiID0gInhubyI7IHRoZW4KICAgIyBtaW5pbXVtIG1pYiBtb2R1bGUgbGlzdCBmb3Igc25tcHRyYXBkCiAgIG5ld19tb2R1bGVfbGlzdD0ibWliSUkvdmFjbV92YXJzIHV0aWxpdGllcy9leGVjdXRlICRuZXdfd2l0aF9taWJfbW9kdWxlcyIKICAgZGVmYXVsdF9taWJzPVNOTVB2Mi1NSUI6UkZDMTIxMy1NSUIKICAgZGVmYXVsdF9taWJzX2luc3RhbGw9IiAiCmVsaWYgdGVzdCAieCRtaW5pX2FnZW50IiA9ICJ4eWVzIjsgdGhlbgogICAjIGRlZmluZSB0aGUgbWluaSBhZ2VudCBmbGFnIHRvIHJlZHVjZSBvdXIgbG9hZCBsaXN0IGZyb20gZGVmYXVsdF9taWJzLmgKICAgTU9EVUxFQ1BQPSIkTU9EVUxFQ1BQIC1ETkVUU05NUF9NSU5JX0FHRU5UIgpmaQoKaWYgdGVzdCAieCR0cmFuc3BvcnRfY2FsbGJhY2tfZGlzYWJsZWQiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgQUNfTVNHX1dBUk4oRGlzYWJsaW5nIENhbGxiYWNrIHRyYW5zcG9ydCB3aWxsIGRpc2FibGUgQWdlbnRYIHN1cHBvcnQuKQogICAgICAgIG5ld193aXRoX291dF9taWJfbW9kdWxlcz0iYWdlbnR4ICRuZXdfd2l0aF9vdXRfbWliX21vZHVsZXMiCmZpCgppZiB0ZXN0ICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgoJbmV3X21vZHVsZV9saXN0PSIkbmV3X21vZHVsZV9saXN0IG1pYklJL2lwdjYiCmZpCgp0ZXN0X21vZHVsZXM9IiRuZXdfbW9kdWxlX2xpc3QiCm5ld19tb2R1bGVfbGlzdD0iIgptb2R1bGVfbGlzdF9oPSIiCgojIHJlbW92ZSBtb2R1bGVzIHRoYXQgd2VyZSBleHBsaWNpdHkgZXhjbHVkZWQKZm9yIGkgaW4gJHRlc3RfbW9kdWxlcwogZG8KICBpZiBlY2hvICIgJG5ld193aXRoX291dF9taWJfbW9kdWxlcyAiIHwgZ3JlcCAiICRpICIgPiAvZGV2L251bGw7IHRoZW4KICAgIG1pYl9jZmdfbXNnPSJtaWIgbW9kdWxlICckaScgaXMgYm90aCBpbmNsdWRlZCBhbmQgZXhjbHVkZWQuIgogICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgY29uZmxpY3RdKQogICAgaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19NU0dfV0FSTihbdXNlciB3aXRoICAgIDogJHdpdGhfbWliX21vZHVsZXNdKQogICAgICBBQ19NU0dfV0FSTihbZmluYWwgd2l0aCAgIDogJG5ld19tb2R1bGVfbGlzdF0pCiAgICAgIEFDX01TR19XQVJOKFt1c2VyIHdpdGhvdXQgOiAkd2l0aF9vdXRfbWliX21vZHVsZXNdKQogICAgICBBQ19NU0dfV0FSTihbZmluYWwgd2l0aG91dDogJG5ld193aXRoX291dF9taWJfbW9kdWxlc10pCiAgICAgIEFDX01TR19FUlJPUihbJG1pYl9jZmdfbXNnXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX1dBUk4oWyRtaWJfY2ZnX21zZyBJdCB3aWxsIGJlIGV4Y2x1ZGVkXSkKICAgICAgQUNfTVNHX0NBQ0hFX0FERChbKioqIE1JQiBNb2R1bGUgd2FybmluZyAqKiogJG1pYl9jZmdfbXNnIEl0IGhhcyBiZWVuIGV4Y2x1ZGVkLl0pCiAgICBmaQogIGVsc2UKICAgIG5ld19tb2R1bGVfbGlzdD0iJG5ld19tb2R1bGVfbGlzdCAkaSIKICBmaQpkb25lCgpBQ19NU0dfUkVTVUxUKFskbmV3X21vZHVsZV9saXN0Ll0pCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgbG9vcCBvdmVyIG1vZHVsZSBsaXN0CiMKYWxsX3dhcm5pbmdzPSIiCmlmIHRlc3QgIngkd2l0aF9taWJfY2ZnX2RlYnVnIiA9ICJ4eWVzIjsgdGhlbgogICBtb2R1bGVfZGVidWc9MQplbHNlCiAgIG1vZHVsZV9kZWJ1Zz0wCmZpCmZpcnN0X3Bhc3M9MQoKb3V0cHV0X3RvPW5vcm1hbAptb2R1bGVfcnVsZXM9bW9kdWxlX3J1bGVzLm1rCmVjaG8gIiMgY29udGVudHMgYmVsb3cgYnVpbHQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmU7IGRvIG5vdCBlZGl0IGJ5IGhhbmQiID4gJG1vZHVsZV9ydWxlcwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHVudGlsIHdlIGhhdmUgYW4gZW1wdHkgbW9kdWxlIGxpc3QuLi4KIyAgIChtb2R1bGVzIG1heSBhZGQgbmV3IG1vZHVsZXMsIGFuZCB1bnRpbCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBkb25lLi4uKQojCndoaWxlIHRlc3QgIngkbmV3X21vZHVsZV9saXN0IiAhPSAieCI7IGRvCiAgQUNfTVNHX01PRFVMRV9EQkcoLWUsIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpCiAgQUNfTVNHX01PRFVMRV9EQkcoIm5tbDogJG5ld19tb2R1bGVfbGlzdCIpCgogICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAjIGxvb3Agb3ZlciBhbGwgdGhlIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgbGlzdAogICMKICBmb3IgaiBpbiAkbmV3X21vZHVsZV9saXN0CiAgICBkbwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZmlndXJlIG91dCB3aGljaCBzdWItYmxvY2tzIHRvIGJ1aWxkIGluIHBhcnRzCiAgICBpZiBlY2hvICIkaiIgfCBncmVwICI9IiA7IHRoZW4KICAgICAgICMgYnVpbGQgYSBzaGFyZWQgb2JqZWN0IGZpbGUKICAgICAgICMgZm9ybWF0OiBzb2ZpbGVuYW1lPW1vZHVsZTE6bW9kdWxlMgogICAgICAgIyBYWFg6IGN1cnJlbnRseSBkb2Vzbid0IGRvIHRoaXMKICAgICAgIGRsX25hbWU9YGVjaG8gJGogfCBzZWQgJ3MvPS4qLy8nYAogICAgICAgZGxfbmFtZXM9IiRkbF9uYW1lcyAkZGxfbmFtZSIKICAgICAgIGRsX29iamVjdHM9YGVjaG8gJGogfCBzZWQgJ3MvLio9Ly8nYAogICAgICAgbW9kdWxlX3N1Ymxpc3Q9YGVjaG8gJGRsX29iamVjdHMgfCBzZWQgJ3MvOi8gL2cnYAogICAgICAgc2F2ZWRfc3VibGlzdD0iIgogICAgICAgc2F2ZWRfc3VibGlzdF9jb2RlPSIiCiAgICAgICBvdXRwdXRfdG89c2VwYXJhdGUKCiAgICAgICAjIGNyZWF0ZSBvdXRwdXQgZmlsZXMKICAgICAgICMgdGhlc2UgYWN0dWFsbHkgZ2V0IG51a2VkIGxhdGVyCiAgICAgICBvdXRwdXRfaW5pdHM9ImFnZW50L21pYmdyb3VwLyR7ZGxfbmFtZX0tZGxsLmMiCiAgICAgICBvdXRwdXRfaGRycz0iYWdlbnQvbWliZ3JvdXAvJHtkbF9uYW1lfS1oZHJzLmgiCiAgICBlbHNlCiAgICAgICAjIG5vdCBhIHNwZWNpYWwgdG9rZW4gaW52b2NhdGlvbgogICAgICAgbW9kdWxlX3N1Ymxpc3Q9JGoKICAgICAgIG91dHB1dF90bz1ub3JtYWwKICAgICAgIG91dHB1dF90PQogICAgZmkKCiAgICB3aGlsZSB0ZXN0ICJ4JG1vZHVsZV9zdWJsaXN0IiAhPSAieCIgOyBkbwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgbG9vcCBvdmVyIGFsbCB0aGUgbW9kdWxlcyBpbiB0aGUgc3ViIGxpc3QKICAgIGZvciBpIGluICRtb2R1bGVfc3VibGlzdAogICAgZG8KCiAgICBBQ19NU0dfTU9EVUxFX0RCRygtZSAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKICAgIEFDX01TR19NT0RVTEVfREJHKCJ0ZXN0aW5nICRpIikKICAgIG5lZWRfaGVhZGVyPTAKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGJ1aWxkIGEgcHNldWRvIGluY2x1ZGUgaGVhZGVyIHRoYXQgaW5jbHVkZXMgY3VycmVudCBjb25maWcgYW5kCiAgICAjIHN5c3RlbSBzeW1ib2xzOgogICAgZWNobyAiI2luY2x1ZGUgIiciJyIkYWNfY3ZfTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFIiciJyA+IG1vZHVsZV90bXBfaGVhZGVyLmgKICAgIGVjaG8gIiNpbmNsdWRlICInIiciJHNyY2Rpci8kbWliZGlyLyRpLmgiJyInID4+IG1vZHVsZV90bXBfaGVhZGVyLmgKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIG1hY3JvOiBjb25maWdfYmVsb25nc19pbihBUkcpCiAgICAjICAgQVJHOiBlaXRoZXIKICAgICMgICAgIC0gbWliX21vZHVsZSAgID0+IGxpYm5ldHNubXBtaWJzICAgKGRlZmF1bHQpCiAgICAjICAgICAtIGFnZW50X21vZHVsZSA9PiBsaWJuZXRzbm1wYWdlbnQKICAgICMKICAgIG1vZHVsZV90eXBlPW1pYl9tb2R1bGUKICAgIGlmIHRlc3QgLWYgJHNyY2Rpci8kbWliZGlyLyRpLmg7IHRoZW4KICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgIG1vZHVsZV90eXBlPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19iZWxvbmdzX2luIHwgc2VkICdzQC4qY29uZmlnX2JlbG9uZ3NfaW4oXChbXildKlwpKS4qQFwxQCdgCiAgICAgIGNoYW5nZXF1b3RlKFssIF0pCiAgICBmaQogICAgaWYgdGVzdCAieCRtb2R1bGVfdHlwZSIgPSAieCIgOyB0aGVuCiAgICAgIG1vZHVsZV90eXBlPW1pYl9tb2R1bGUKICAgIGZpCiAgICBpZiB0ZXN0ICJ4JG91dHB1dF90byIgPSAieG5vcm1hbCIgOyB0aGVuCiAgICAgCW91dHB1dF9pbml0cz0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbml0cy5oIgogICAgIAlvdXRwdXRfaGRycz0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbmNsdWRlcy5oIgogICAgZmkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgd2l0aGluIHRoZSBkbGwgc3lzdGVtLiAKICAgICMgICAtIGlmIGZvdW5kIGluIGEgZGxsLCB0aGVuIHJlbW92ZSBmcm9tIHRoZSBkbGwgYW5kIGFkZCB0byBtYWluCiAgICBkYmxmaXg9IiIKICAgIGZvciBkbHRlc3QgaW4gJGRsX25hbWVzIDsgZG8KICAgICAgZXZhbCBtb2RfZmlsZXM9IlwiXCRkbF8ke2RsdGVzdH1fZmlsZXNcIiIKICAgICAgaWYgZWNobyAiICRtb2RfZmlsZXMgIiB8IGdyZXAgIiAkaSAiID4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgIyBzb21lIGRsbCBtb2R1bGUgaGFzIGFscmVhZHkgc2VlbiB0aGlzLCB1bmxvYWQgaXQgZnJvbSB0aGF0IGxpc3QKICAgICAgICAjIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBjb3JlIChhZ2FpbikKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygicmVtb3ZpbmcgJGkgZnJvbSAkZGx0ZXN0IikKICAgICAgICBtb2RfZmlsZXM9YGVjaG8gIiAkbW9kX2ZpbGVzICIgfCBzZWQgInNAICRpIEBAImAKICAgICAgICBkYmxmaXg9Il9fWFhYX18iCiAgICAgICAgZXZhbCAiZGxfJHtkbHRlc3R9X2ZpbGVzPVwiJG1vZF9maWxlc1wiIgoKICAgICAgICBtb2R1bGVfbGlzdD0iJG1vZHVsZV9saXN0ICRpIgogICAgICAgIG1vZHVsZV9saXN0X2g9IiRtb2R1bGVfbGlzdF9oIG1pYmdyb3VwLyRpLmgiCiAgICAgICAgZXZhbCAke21vZHVsZV90eXBlfV9saXN0PSJcIlwkJHttb2R1bGVfdHlwZX1fbGlzdCAkaVwiIgogICAgICAgIGV2YWwgJHttb2R1bGVfdHlwZX1fbGlzdF9oPSJcIlwkJHttb2R1bGVfdHlwZX1fbGlzdF9oIG1pYmdyb3VwLyRpLmhcIiIKICAgICAgICBtb2R1bGVfbGlzdF9jb2RlPSIkbW9kdWxlX2xpc3RfY29kZSAkaSIKICAgICAgICBldmFsICR7bW9kdWxlX3R5cGV9X2xpc3RfY29kZT0iXCJcJCR7bW9kdWxlX3R5cGV9X2xpc3RfY29kZSAkaVwiIgoKCSMgWFhYOiBhZGQgdGhpcyB0byB0aGUgbWFpbiBpbml0IGxpc3Q7IHRoaXMgaXMgcG9zc2libGUgbm90CgkjIHF1aXRlIGluIHRoZSByaWdodCBzcG90IGFueSBsb25nZXIgYnV0IHdlJ3JlIHN0dWNrIHdpdGggaXQuCgkjIEFkZGluZyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBvcmRlcmVkIHNwb3Qgd291bGQgYmUgYQoJIyBuaWdodG1hcmUuICBPaywgd2UncmUgYWxyZWFkeSBpbiBuaWdodG1hcmUgY29kZSBzbyB0aGF0CgkjIHdvbHVkIGhhdmUgdG8gYmUgYSBuaWdodC10ZXJyb3IuCiAgICAgICAgbW5tPWBlY2hvICRpIHwgc2VkICdzLy4qXC8vLztzL1wuYyQvLzsnYAoJb3V0cHV0X2luaXRzX3RtcD0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbml0cy5oIgoJZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCIkbW5tXCIpKSBpbml0XyRtbm0oKTsiID4+ICRvdXRwdXRfaW5pdHNfdG1wCiAgICAgICAgIyBYWFg6IGV2ZW4gd29yc2UsIHdlIGxvb3NlIHdoZXRoZXIgdGhlIGhlYWRlciBpcyBuZWVkZWQgb3Igbm90LgogICAgIAlvdXRwdXRfaGRyc190bXA9IiRtaWJkaXIvJHttb2R1bGVfdHlwZX1faW5jbHVkZXMuaCIKICAgICAgICBlY2hvICcjaW5jbHVkZSAiJyJtaWJncm91cC8kaS5oIiciJyA+PiAkb3V0cHV0X2hkcnNfdG1wCiAgICAgIGZpCiAgICBkb25lCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBtYWtlIHN1cmUgbW9kdWxlIHdhc24ndCBleHBsaWNpdHkgZXhjbHVkZWQsIG9yIGFscmVhZHkgYWRkZWQKICAgICMKICAgIGlmIHRlc3QgIngkZGJsZml4IiAhPSAieCIgOyB0aGVuCiAgICAgIEFDX01TR19NT0RVTEVfREJHKCIkaSB3YXMgZHVwbGljYXRlZCAtLSBwdXR0aW5nIGludG8gbWFpbiIpCiAgICBlbGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzICIgfCBncmVwICIgJGkgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICBBQ19NU0dfTU9EVUxFX0RCRygiJGkgd2FzIGV4Y2x1ZGVkIikKICAgIGVsaWYgZWNobyAiICRtb2R1bGVfbGlzdCAiIHwgZ3JlcCAiICRpICIgPiAvZGV2L251bGw7IHRoZW4KICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiRpIGFscmVhZHkgdGVzdGVkIikKICAgIGVsc2UKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBwcm9jZXNzIG1vZHVsZXMgaGVhZGVyLCBjaGVja2luZyBmb3IgY29uZmlnXyBwc2V1ZG8tbWFjcm9zCiAgICAgICMKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBkb2VzIHRoZSBoZWFkZXIgZmlsZSBmb3IgdGhlIG1vZHVsZSBleGlzdD8KICAgICAgIyAgIG1hY3JvcyBhcmUgb25seSBwcm9jZXNzZWQgaWYgaXQgZG9lcwogICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJG1pYmRpci8kaS5oOyB0aGVuCiAgICAgICAgbmV3X2xpc3Q9IiIKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAJIyBtYWNybzogY29uZmlnX2V4Y2x1ZGUobW9kdWxlcykKICAgICAgCSMgIC0gbGlzdHMgY29uZmxpY3RzIHdpdGggb3RoZXIgbW9kdWxlcwogICAgICAJIyAgICAtIEVHOiBuZXcgTUlCIGltcGxlbWVudGF0aW9ucyBleGNsdWRlIG9sZCBhbmQgdmljZS12ZXJzYQogICAgICAJIwogICAgICAgICMgY2hlY2sgaWYgJGkgaGFzIGFueSBjb25mbGljdHMKICAgICAgICAjCgluZXdfbGlzdF9leGNsPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19leGNsdWRlIHwgc2VkICdzLy4qY29uZmlnX2V4Y2x1ZGUoXCguKlwpKS4qL1wxLydgCglpZiB0ZXN0ICJ4JG5ld19saXN0X2V4Y2wiICE9ICJ4IjsgdGhlbgogICAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiRpIGV4Y2x1ZGVzICRuZXdfbGlzdF9leGNsIikKCSAgZm9yIGogaW4gJG5ld19saXN0X2V4Y2wKCSAgICBkbwoJICAgIGlmIGVjaG8gIiAkbW9kdWxlX2xpc3QgJG5ld19taWJfbW9kdWxlX2xpc3QgJG5ld19saXN0X3R3byAiIHwgZ3JlcCAiICRqICIgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBtaWJfY2ZnX21zZz0ibWliIG1vZHVsZSAnJGknIGV4Y2x1ZGVzIG1vZHVsZSAnJGonIGJ1dCBhbm90aGVyIG1vZHVsZSByZXF1aXJlcyBpdCIKICAgICAgICAgICAgICBBQ19NU0dfV0FSTihbbWliIG1vZHVsZSBlcnJvcl0pCiAgICAgICAgICAgICAgaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgoJICAgICAgICBBQ19NU0dfRVJST1IoWyRtaWJfY2ZnX21zZ10pCiAgICAgICAgICAgICAgZWxzZQoJICAgICAgICBBQ19NU0dfV0FSTihbJG1pYl9jZmdfbXNnXSkKICAgICAgICAgICAgICAgIEFDX01TR19DQUNIRV9BREQoWyoqKiBNSUIgTW9kdWxlIHdhcm5pbmcgKioqICRtaWJfY2ZnX21zZ10pCiAgICAgICAgICAgICAgZmkKCSAgICBlbHNlCgkgICAgICBuZXdfd2l0aF9vdXRfbWliX21vZHVsZXM9IiRqICRuZXdfd2l0aF9vdXRfbWliX21vZHVsZXMiCiAgICAgICAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiRqIGFkZGVkIHRvIGV4Y2x1ZGVkIGxpc3QiKQoJICAgIGZpCgkgIGRvbmUKCWZpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19hcmNoX3JlcXVpcmUoQVJDSCxtb2R1bGVzKQogICAgICAJIyAgLSBsaXN0cyBtb2R1bGVzIHJlcXVpcmVkIGZvciBhIGdpdmVuIEFSQ0gKICAgICAgICAjCiAgICAgICAgIyBjaGVjayBpZiAkaSBoYXMgYW55IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyByZXF1aXJlbWVudHMKICAgICAgICAjCiAgICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgICAgbmV3X2xpc3RfYXJjaD1gJE1PRFVMRUNQUCBtb2R1bGVfdG1wX2hlYWRlci5oIHwgZ3JlcCBjb25maWdfYXJjaF9yZXF1aXJlIHwgc2VkICdzLy4qY29uZmlnX2FyY2hfcmVxdWlyZSggKlwoW14gXSpcKSAqLCAqXChbXiBdKlwpICopLiovXDEteGFyY2h4LVwyLydgCiAgICAgICAgY2hhbmdlcXVvdGUoWywgXSkKCWlmIHRlc3QgIngkbmV3X2xpc3RfYXJjaCIgIT0gIngiOyB0aGVuCiAgICAgICAgICBmb3IgaiBpbiAkbmV3X2xpc3RfYXJjaAoJICAgIGRvCgkgICAgYXJjaHRlc3Q9YGVjaG8gJGogfCBzZWQgJ3MvLXhhcmNoeC0uKi8vJ2AKCSAgICAjIHRhcmdldF9vcyBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYSAjZGVmaW5lIG9mIDEuLi4KCSAgICBpZiB0ZXN0ICJ4JGFyY2h0ZXN0IiA9ICJ4MSIgLW8gIngkdGFyZ2V0X29zIiA9ICJ4JGFyY2h0ZXN0IiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gIngkYXJjaHRlc3QiOyB0aGVuCgkgICAgICBuZXdfbGlzdD0iJG5ld19saXN0IGBlY2hvICRqIHwgc2VkICdzLy4qLXhhcmNoeC0vLydgIgogICAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgJGkgcmVxdWlyZWQgYWRkaW5nIGFyY2ggZmlsZXM6IGBlY2hvICRqIHwgc2VkICdzLy4qLXhhcmNoeC0vLydgIikKCSAgICBmaQoJICBkb25lCglmaQogICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgJGkgcmVxdWlyZWQgYXJjaCBmaWxlczogJG5ld19saXN0IikKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAJIyBtYWNybzogY29uZmlnX3JlcXVpcmUobW9kdWxlcykKICAgICAgCSMgIC0gbGlzdHMgbW9kdWxlcyByZXF1aXJlZCBmb3IgdGhpcyBtb2R1bGUKICAgICAgICAjCiAgICAgICAgIyBjaGVjayBpZiAkaSBoYXMgYW55IG90aGVyIHJlcXVpcmVkIG1vZHVsZXMKICAgICAgICAjCgluZXdfbGlzdD0iJG5ld19saXN0IGAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19yZXF1aXJlIHwgc2VkICdzLy4qY29uZmlnX3JlcXVpcmUoXCguKlwpKS4qL1wxLydgIgogICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgJGkgd2lsbCB0ZXN0OiAkbmV3X2xpc3QiKQoJaWYgdGVzdCAieCRuZXdfbGlzdCIgIT0gIngiOyB0aGVuCgkgIGZvciBqIGluICRuZXdfbGlzdAoJICAgIGRvCiAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKC1uICIgJGkgd2FudHMgdG8gYWRkICRqOiAiKQoJICAgIGlmIHRlc3QgISAtZiAkc3JjZGlyLyRtaWJkaXIvJGouaCAtYSAhIC1mICRzcmNkaXIvJG1pYmRpci8kai5jOyB0aGVuCiAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgZXJyb3JdKQoJICAgICAgQUNfTVNHX0VSUk9SKFttaWIgbW9kdWxlICIkaSIgcmVxdWlyZXMgbW9kdWxlICIkaiIgYnV0ICRqLmggb3IgJGouYyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJHNyY2Rpci8kbWliZGlyXSkKCSAgICBlbGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzICIgfCBncmVwICIgJGogIiA+IC9kZXYvbnVsbDsgdGhlbgoJICAgICAgaWYgdGVzdCAieCRpIiAhPSAieGRlZmF1bHRfbW9kdWxlcyIgOyB0aGVuCiAgICAgICAgICAgICAgICBtaWJfY2ZnX21zZz0ibWliIG1vZHVsZSAnJGknIHJlcXVpcmVzIG1vZHVsZSAnJGonIGJ1dCBzb21lb25lIHRvbGQgbWUgdG8gY29tcGlsZSB3aXRob3V0IGl0IgogICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgZXJyb3JdKQogICAgICAgICAgICAgICAgaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoWyRtaWJfY2ZnX21zZ10pCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKFskbWliX2NmZ19tc2ddKQogICAgICAgICAgICAgICAgICBBQ19NU0dfQ0FDSEVfQUREKFsqKiogTUlCIE1vZHVsZSB3YXJuaW5nICoqKiAkbWliX2NmZ19tc2ddKQogICAgICAgICAgICAgICAgZmkKIwkgICAgZWxpZiBlY2hvICIgJG1vZHVsZV9saXN0ICRuZXdfbGlzdF90d28gJG5ld19tb2R1bGVfbGlzdCAiIHwgZ3JlcCAiICRqICIgPiAvZGV2L251bGw7IHRoZW4KIyAgICAgICAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiAgJGogaW5jbHVkZWQgcHJldmlvdXNseSIpCiAgICAgICAgICAgICAgZmkKCSAgICBlbHNlCgkgICAgICBuZXdfbGlzdF90d289IiRuZXdfbGlzdF90d28gJGoiCiAgICAgICAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiAgJGogaW5jbHVkZWQiKQoJICAgIGZpCgkgIGRvbmUKCWZpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19hZGRfbWliKFNPTUUtTUlCKQogICAgICAJIyAgLSBsaXN0cyBNSUJzIHRvIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IHRvLWxvYWQgbGlzdC4KICAgICAgICAjCiAgICAgICAgIyBjaGVjayBpZiAkaSBoYXMgYW55IG1pYnMgdG8gYWRkCiAgICAgICAgIwoJbmV3X21pYnM9YCRNT0RVTEVDUFAgbW9kdWxlX3RtcF9oZWFkZXIuaCB8IGdyZXAgY29uZmlnX2FkZF9taWIgfCBzZWQgJ3MvLipjb25maWdfYWRkX21pYihcKC4qXCkpLiovXDEvJ2AKCWlmIHRlc3QgIngkbmV3X21pYnMiICE9ICJ4IjsgdGhlbgoJICAgIGZvciBqIGluICRuZXdfbWlicwoJCWRvCgkJaWYgdGVzdCAieGBlY2hvIDokZGVmYXVsdF9taWJzOiB8IGdyZXAgOiRqOmAiID0gIngiOyB0aGVuCgkJICAgIGRlZmF1bHRfbWlicz0iJGRlZmF1bHRfbWliczokaiIKCQlmaQoJCWlmIHRlc3QgLWYgJHNyY2Rpci9taWJzLyRqLnR4dDsgdGhlbgoJCSAgICBpZiBlY2hvICRkZWZhdWx0X21pYnNfaW5zdGFsbCB8IGdyZXAgIiAkaiAiID4gL2Rldi9udWxsOyB0aGVuCgkJCSAgICA6CgkJICAgIGVsc2UKCQkJICAgIGRlZmF1bHRfbWlic19pbnN0YWxsPSIkZGVmYXVsdF9taWJzX2luc3RhbGwgJGoudHh0IgoJCSAgICBmaQoJCWZpCgkgICAgZG9uZQoJZmkgIyBuZXcgbWlicwoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgYWRkIHRoZSBjdXJyZW50IG1vZHVsZSB0byB0aGUgbGlzdCBvZiBzdHVmZiB0byBjb21waWxlLCBldGMuCiAgICAgICAgIwogICAgICAgICMgYWRkICRpIHRvIG1vZHVsZSBsaXN0CiAgICAgICAgIwogICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgICRpIGFkZGVkIChiYXNlZCBvbiAkaS5oKSIpCiAgICAgICAgbW9kdWxlX2xpc3Q9IiRtb2R1bGVfbGlzdCAkaSIKICAgICAgICBtb2R1bGVfbGlzdF9oPSIkbW9kdWxlX2xpc3RfaCBtaWJncm91cC8kaS5oIgogICAgICAgIGV2YWwgJHttb2R1bGVfdHlwZX1fbGlzdD0iXCJcJCR7bW9kdWxlX3R5cGV9X2xpc3QgJGlcIiIKICAgICAgICBldmFsICR7bW9kdWxlX3R5cGV9X2xpc3RfaD0iXCJcJCR7bW9kdWxlX3R5cGV9X2xpc3RfaCBtaWJncm91cC8kaS5oXCIiCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBjaGVjayBmb3IgdW5zdXBwb3J0ZWQgY29uZmlnX2xvYWRfbWliCiAgICAgICAgIwogICAgICAgIGlmICRNT0RVTEVDUFAgbW9kdWxlX3RtcF9oZWFkZXIuaCB8IGdyZXAgY29uZmlnX2xvYWRfbWliID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKICAgICAgCSAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgIiRpIiB1c2VzIHRoZSAiY29uZmlnX2xvYWRfbWliIiBkaXJlY3RpdmUsIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJdCBwcm9iYWJseSB3b24ndCB3b3JrLl0pCiAgICAgICAgZmkgIyBncmVwIGNvbmZpZ19sb2FkX21pYgoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgY2hlY2sgZm9yIGNvbmZpZ19wYXJzZV9kb3RfY29uZgogICAgICAgICMgIChnZW5lcmFsbHkgbm90IHVzZWQgYW55IGxvbmdlcjsgb2xkIGF1dG8tbG9hZCBhIC5jb25mIHRva2VuKQogICAgICAgICMKICAgICAgICBjaGFuZ2VxdW90ZSgsICkKICAgICAgICAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19wYXJzZV9kb3RfY29uZiB8IHNlZCAnc0AuKmNvbmZpZ19wYXJzZV9kb3RfY29uZihcKFteKV0qXCksICpcKFteKSxdKlwpLCAqXChbXiksXSpcKSwgKlwoW14pLF0qXCkpLipAcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInNubXBkIixcMSwgXDIsIFwzLCBcNCk7QCcgPj4gJG1pYmRpci9taWJfbW9kdWxlX2RvdF9jb25mLmgKCWNoYW5nZXF1b3RlKFssIF0pCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19lcnJvcihlcnJvciB0ZXh0KQogICAgICAJIyAgLSB1c2VkIHRvIHNpZ25hbCBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgZnJvbSBhIG1vZHVsZQogICAgICAgICMKICAgICAgICAjIGNoZWNrIGlmICRpIGhhcyBhbnkgZXJyb3JzLCBvciB3YXJuaW5ncwogICAgICAgICMKCWVycm9yPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19lcnJvciB8IHNlZCAncy8uKmNvbmZpZ19lcnJvcihcKC4qXCkpLiovXDEvJ2AKCWlmIHRlc3QgIngkZXJyb3IiICE9ICJ4IjsgdGhlbgogICAgICAgICAgZWNobwogICAgICAgICAgZWNobwogICAgICAgICAgQUNfTVNHX0VSUk9SKFskaTogKioqICRlcnJvciAqKipdKQogICAgICAgIGZpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ193YXJuaW5nKHdhcm5pbmcgdGV4dCkKICAgICAgCSMgIC0gdXNlZCB0byBzaWduYWwgYSBjb25maWd1cmF0aW9uICJ3YXJuaW5nIiB0byBiZSBwcmludGVkIHRvIHRoZSB1c2VyCiAgICAgICAgIwoJd2FybmluZz1gJE1PRFVMRUNQUCBtb2R1bGVfdG1wX2hlYWRlci5oIHwgZ3JlcCBjb25maWdfd2FybmluZyB8IHNlZCAncy8uKmNvbmZpZ193YXJuaW5nKFwoLipcKSkuKi9cMS8nYAoJaWYgdGVzdCAieCR3YXJuaW5nIiAhPSAieCI7IHRoZW4KICAgICAgICAgIGFsbF93YXJuaW5ncz0iJGFsbF93YXJuaW5ncyAkd2FybmluZwoiCiAgICAgICAgZmkKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBDaGVjayBmb3IgYSAuYyBmaWxlIGlmIHRoZSAuaCBkaWRuJ3QgZXhpc3QKICAgICAgIwogICAgICBlbGlmIHRlc3QgLWYgJHNyY2Rpci8kbWliZGlyLyRpLmM7IHRoZW4KICAgICAgICBpZiBlY2hvICIgJG1vZHVsZV9saXN0ICRuZXdfbGlzdF90d28gJG5ld19tb2R1bGVfbGlzdCAiIHwgZ3JlcCAiICRpICAgICAgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgICRpIGFscmVhZHkgaW5jbHVkZWQiKQogICAgICAgIGVsc2UKICAgICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICAkaSBhZGRlZCAoYmFzZWQgb24gJGkuYykiKQoJICAgbW9kdWxlX2xpc3Q9IiRtb2R1bGVfbGlzdCAkaSIKCSAgIG1pYl9tb2R1bGVfbGlzdD0iJG1pYl9tb2R1bGVfbGlzdCAkaSIKICAgICAgICBmaQoKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIE5vIC5oIG9yIC5jID0gZXJyb3IhICAodHlwbz8pCiAgICAgICMKICAgICAgZWxzZSAjIG5vICRpLmggb3IgJGkuYwogICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKCUFDX01TR19FUlJPUihbbW9kdWxlIGZpbGVzICRpLmggb3IgJGkuYyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJHNyY2Rpci8kbWliZGlyXSkKICAgICAgZmkgIyBubyAkaS5oCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIGNoZWNrIGZvciBpbml0L3NodXRkb3duIHJvdXRpbmVzIHRvbwogICAgICAjCiAgICAgIGhhc19jX2NvZGU9bm8KICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRtaWJkaXIvJGkuYzsgdGhlbgogICAgICAgIGlmIHRlc3QgIngkb3V0cHV0X3RvIiA9ICJ4bm9ybWFsIiA7IHRoZW4KICAgICAgICAgIG1vZHVsZV9saXN0X2NvZGU9IiRtb2R1bGVfbGlzdF9jb2RlICRpIgogICAgICAgICAgZXZhbCAke21vZHVsZV90eXBlfV9saXN0X2NvZGU9IlwiXCQke21vZHVsZV90eXBlfV9saXN0X2NvZGUgJGlcIiIKICAgICAgICBlbHNlCiAgICAgICAgICBldmFsICJkbF8ke2RsX25hbWV9X2ZpbGVzPVwiXCRkbF8ke2RsX25hbWV9X2ZpbGVzICRpXCIiCiAgICAgICAgICBzYXZlZF9zdWJsaXN0X2NvZGU9IiRzYXZlZF9zdWJsaXN0X2NvZGUgJGkiCiAgICAgICAgZmkKICAgICAgICBtbm09YGVjaG8gJGkgfCBzZWQgJ3MvLipcLy8vO3MvXC5jJC8vOydgCiAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoLWUgIlxuY2hlY2tpbmcgJyRzcmNkaXIvJG1pYmRpci8kaS5jJyAoJG1ubS9gYmFzZW5hbWUgJGlgKSBDIGZpbGUgZm9yIGluaXQvc2h1dGRvd24iKQogICAgICAgIGlmIHRlc3QgIngkbW5tIiAhPSAieGBiYXNlbmFtZSAkaWAiOyB0aGVuCiAgICAgICAgICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgZXJyb3JdKQoJICAgQUNfTVNHX0VSUk9SKFtjb25mbGljdGluZyBuYW1lczogJG1ubSAhPSBgYmFzZW5hbWUgJGlgXSkKICAgICAgICBmaQogICAgICAgIHRlbXBfaW5pdD1gZ3JlcCBpbml0XyRtbm0gJHNyY2Rpci8kbWliZGlyLyRpLmMgfCBncmVwIC12IF9pbml0XyRtbm1gCglpZiB0ZXN0ICJ4JHRlbXBfaW5pdCIgIT0gIngiOyB0aGVuCiAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKC1lICJhZGRpbmcgaW5pdF8kbW5tKCkgdG8gbGlzdCIpCiAgICAgICAgICAgIG5lZWRfaGVhZGVyPTEKCSAgICBlY2hvICIgIGlmIChzaG91bGRfaW5pdChcIiRtbm1cIikpIGluaXRfJG1ubSgpOyIgPj4gJG91dHB1dF9pbml0cwoJZmkKCWdyZXAgc2h1dGRvd25fJG1ubSAkc3JjZGlyLyRtaWJkaXIvJGkuYyA+IC9kZXYvbnVsbAogICAgICAgIGlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCiAgICAgICAgICAgIGlmIHRlc3QgJG1vZHVsZV9kZWJ1ZyAtZXEgMTsgdGhlbgogICAgICAgICAgICAgIGVjaG8gLWUgIlxuYWRkaW5nIHNodXRkb3duXyRtbm0oKSB0byBsaXN0IgogICAgICAgICAgICBmaQogICAgICAgICAgICBuZWVkX2hlYWRlcj0xCgkgICAgZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCIkbW5tXCIpKSBzaHV0ZG93bl8kbW5tKCk7IiA+PiAkbWliZGlyLyR7bW9kdWxlX3R5cGV9X3NodXRkb3duLmgKCWZpCiAgICAgIGZpICMgdGVzdCAtZiAkc3JjZGlyLyRtaWJkaXIvJGkuYwoKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBpZiB0aGVyZSBpcyBhIHNodXRkb3duL2luaXQgbGlzdCwKICAgICAgIwogICAgICBpZiB0ZXN0ICRuZWVkX2hlYWRlciAtZXEgMSA7IHRoZW4KICAgICAgICAgZWNobyAnI2luY2x1ZGUgIicibWliZ3JvdXAvJGkuaCInIicgPj4gJG91dHB1dF9oZHJzCiAgICAgIGVsc2UKICAgICAgICAgZWNobyAnLyojaW5jbHVkZSAiJyJtaWJncm91cC8kaS5oIiciKi8nID4+ICRvdXRwdXRfaGRycwogICAgICBmaQoKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBjaGVjayBmb3Igb3V0cHV0IGRpcmVjdG9yeSAoZm9yIGJ1aWxkaW5nIG91dHNpZGUgb2Ygc291cmNlIHRyZWUKICAgICAgIwogICAgICBjaGFuZ2VxdW90ZSgsICkKICAgICAgaWYgdGVzdCAieGBlY2hvICRpIHwgc2VkICdzL1wvLy9nOydgIiAhPSAieCRpIjsgdGhlbgoJbW5kPWBlY2hvICRpIHwgc2VkICdzL1wvW14vXSokLy87J2AKCWlmIHRlc3QgISAtZCAuLyRtaWJkaXIvJG1uZDsgdGhlbgoJICAgIG1vZHVsZV9kaXJlY3Rvcmllcz0iJG1vZHVsZV9kaXJlY3RvcmllcyAuLyRtaWJkaXIvJG1uZCIKCWZpCiAgICAgIGZpICMgbW9kdWxlIGRpcmVjdG9yeSB0ZXN0CiAgICAgIGNoYW5nZXF1b3RlKFssIF0pCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIGRlZmluZSBVU0lOR18qX01PRFVMRQogICAgICAjCiAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBzeW09ImBlY2hvICR7aX0gfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2cnIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYCIKICAgICAgY2hhbmdlcXVvdGUoWywgXSkKICAgICAgZWNobyAiLyogRGVmaW5lIGlmIGNvbXBpbGluZyB3aXRoIHRoZSAke2l9IG1vZHVsZSBmaWxlcy4gICovIiA+PiBpbmNsdWRlL25ldC1zbm1wL2FnZW50LyR7bW9kdWxlX3R5cGV9X2NvbmZpZy5oCiAgICAgIGVjaG8gIiNkZWZpbmUgVVNJTkdfJHtzeW19X01PRFVMRSAxIiA+PiBpbmNsdWRlL25ldC1zbm1wL2FnZW50LyR7bW9kdWxlX3R5cGV9X2NvbmZpZy5oCiAgICAgIGVjaG8gIiAiID4+IGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvJHttb2R1bGVfdHlwZX1fY29uZmlnLmgKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGVjaG8gJEVDSE9fTiAiICRpJEVDSE9fQyIKICAgIGZpICMKICAgIGRvbmUgIyBmb3IgaSBpbiAkbW9kdWxlX3N1Ymxpc3QKCiAgICBpZiB0ZXN0ICIkb3V0cHV0X3RvIiA9ICJzZXBhcmF0ZSIgOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkbmV3X2xpc3RfdHdvIiA9ICJ4IiA7IHRoZW4KICAgICAgICAjIG5vIG5ldyBzdWItbW9kdWxlcyB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFyZ2V0CiAgICAgICAgb3V0cHV0X3RvPSJub3JtYWwiCgogICAgICAgIGRsbGNsZWFucz0iJHNhdmVkX3N1Ymxpc3RfbyAkZGxsY2xlYW5zIgogICAgICAgIG91dHB1dF9pbml0cz0iIgogICAgICAgIG1vZHVsZV9zdWJsaXN0PSIiCiAgICAgIGVsc2UKICAgICAgICAjIGEgbW9kdWxlIGhhZCBzdWItbW9kdWxlcyByZXF1aXJlZDsga2VlcCBnb2luJwogICAgICAgIHNhdmVkX3N1Ymxpc3Q9IiRzYXZlZF9zdWJsaXN0ICRtb2R1bGVfc3VibGlzdCIKICAgICAgICBtb2R1bGVfc3VibGlzdD0iJG5ld19saXN0X3R3byIKICAgICAgICBuZXdfbGlzdF90d289IiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgbW9kdWxlX3N1Ymxpc3Q9IiIKICAgIGZpCgogICAgZG9uZSAjIHdoaWxlIG1vZHVsZV9zdWJsaXN0CiAgZG9uZSAjIGZvciBqIGluICRuZXdfbW9kdWxlX2xpc3QKCiAgIyByZW1lbWJlciB0aGUgdG9wIGxldmVsIG1vZHVsZXMgZm9yIGxhdGVyIHJlcG9ydGluZwogIGlmIHRlc3QgJGZpcnN0X3Bhc3MgPSAxIDsgdGhlbgogICAgIyByZW1lbWJlciB0aGlzIGxpc3QgZm9yIGxhdGVyIHJlcG9ydGluZwogICAgdG9wX2xldmVsX21vZHVsZXM9IiRuZXdfbW9kdWxlX2xpc3QgPT4gJG5ld19saXN0X3R3byIKICAgIGZpcnN0X3Bhc3M9MAogIGZpCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0KICAjIGlmICRpIGFkZGVkIG5ldyBtb2R1bGVzIHZpcyBjb25maWdfKiwKICAjIGNoZWNrIHRob3NlIG1vZHVsZXMgZm9yIHJlcXVpcmVtZW50cyB0b28KICAjCiAgIyB0cmFuc2ZlciB0aGUgbmV3IG1vZHVsZSB0byBjaGVjayBsaXN0IHRvIHRoZSBub3JtYWwgdmFyaWFibGUKICAjCiAgaWYgdGVzdCAieCRuZXdfbGlzdF90d28iIDsgdGhlbgogICAgb3V0cHV0X3RvPW5vcm1hbAogIGZpCiAgbmV3X21vZHVsZV9saXN0PSIkbmV3X2xpc3RfdHdvIgogIG5ld19saXN0X3R3bz0iIgpkb25lICMgd2hpbGUgdGVzdCAieCRuZXdfbW9kdWxlX2xpc3QiICE9ICJ4IjsgZG8KZWNobyAiIgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY29uc3RydWN0IHRoZSBkbGwgY29kZSBmaWxlcyBhbmQgbWFrZSBydWxlcy4gIFRoaXMgY2FuJ3QgYmUgZG9uZQojIHVudGlsIG5vdyBiZWNhdXNlIGR1bHBpY2F0ZSB1c2Ugb2YgYSBtb2R1bGUgbWVhbnMgaXQgZ2V0cyByZW1vdmVkCiMgZnJvbSB0aGUgZGxsIGFuZCBwdXQgaW50byB0aGUgbWFpbiBhZ2VudC4KIwpmb3IgaSBpbiAkZGxfbmFtZXMgOyBkbwogIGV2YWwgbW9kX2ZpbGVzPSJcIlwkZGxfJHtpfV9maWxlc1wiIgogIGVjaG8gImNvbXBvbmVudHMgaW4gdGhlICRpIGRsbDogJG1vZF9maWxlcyIKCiAgb3V0cHV0X2luaXRzPSJhZ2VudC9taWJncm91cC8ke2l9LWRsbC5jIgogIG91dHB1dF9oZHJzPSJhZ2VudC9taWJncm91cC8ke2l9LWhkcnMuaCIKCiAgQUNfTVNHX01PRFVMRV9EQkcoImNyZWF0aW5nIGRsbCBmaWxlOiAkb3V0cHV0X2luaXRzIikKICBmb3Igb2ZpbGUgaW4gJG91dHB1dF9pbml0cyAkb3V0cHV0X2hkcnMgOyBkbwogICAgaWYgdGVzdCAtZiAkb2ZpbGUgOyB0aGVuCiAgICAgIGlmIGdyZXAgInRoaXMgZmlsZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlIiAkb2ZpbGUgPiAvZGV2L251bGwgMj4mMSA7IHRoZW4KICAJOgogICAgICBlbHNlCiAgCUFDX01TR19FUlJPUihbJG9maWxlIGFscmVhZHkgZXhpc3RlZCA7IGNhbid0IGJ1aWxkIGRsbCBvYmplY3QgJGldKQogICAgICBmaQogICAgZmkKICAgIGNhdCA+ICRvZmlsZSA8PCBFT0ZJRgovKiB4RG8gbm90IGVkaXQ7IHRoaXMgZmlsZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlICovCkVPRklGCiAgZG9uZQoKICBjYXQgPj4gJG91dHB1dF9pbml0cyA8PCBFT0ZPQwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgIiR7aX0taGRycy5oIgp2b2lkCmluaXRfJGkodm9pZCkgewpFT0ZPQwoKICAjIGNyZWF0ZSB0aGUgLnNvIHJ1bGUKICBzYXZlZF9zdWJsaXN0X289YGVjaG8gIiRtb2RfZmlsZXMgIiB8IHNlZCAncy9eICovL2c7cy8gICovLm8gL2c7J2AKCiAgIyBjcmVhdGUgdGhlIHJ1bGVzIGZvciBlYWNoIG9iamVjdAogIGZvciBqIGluICRtb2RfZmlsZXMgOyBkbwogICAgY2F0ID4+ICRtb2R1bGVfcnVsZXMgPDwgRU9GUgokai5vOiAkai5jCglcJChDQykgLWMgXCQoQ1BQRkxBR1MpIFwkKENGTEFHUykgXCQoRExGTEFHUykgLW8gXCRAIFwkPAoKRU9GUgogICAgbW5tPWBlY2hvICRqIHwgc2VkICdzLy4qXC8vLztzL1wuYyQvLzsnYAogICAgZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCIkbW5tXCIpKSBpbml0XyRtbm0oKTsiID4+ICRvdXRwdXRfaW5pdHMKICBkb25lCgogICMgY3JlYXRlIHRoZSBydWxlIGZvciB0aGUgLnNvIGFuZCB3cmFwcGVyIGNvZGUKICBjYXQgPj4gJG1vZHVsZV9ydWxlcyA8PCBFT0ZNCiR7aX0tZGxsLm86ICR7aX0tZGxsLmMKCVwkKENDKSAtYyBcJChDUFBGTEFHUykgXCQoQ0ZMQUdTKSBcJChETEZMQUdTKSAtbyBcJEAgXCQ8Cgoke2l9LnNvOiAkc2F2ZWRfc3VibGlzdF9vICR7aX0tZGxsLm8KCVwkKENDKSBcJChDUFBGTEFHUykgXCQoQ0ZMQUdTKSBcJChETEZMQUdTKSAtbyBcJEAgJHNhdmVkX3N1Ymxpc3RfbyAke2l9LWRsbC5vCgpFT0ZNCiAgICAgICAgY2F0ID4+ICRvdXRwdXRfaW5pdHMgPDwgRU9GT0NGSU4KfQpFT0ZPQ0ZJTgoKZG9uZQoKIyBjbGVhbnVwCnJtIC1mIG1vZHVsZV90bXBfaGVhZGVyLmgKCiMtLS0tLS0tLS0tLS0tLS0tLS0tCiMgYnVpbGQgbW9kdWxlIGxpc3RzIGZvciBNYWtlZmlsZXMKIwpjaGFuZ2VxdW90ZSgsICkKbW9kdWxlX2xpc3Rfbz1gZWNobyAiJG1vZHVsZV9saXN0X2NvZGUgIiB8IHNlZCAncy9cKFteIF1cKSAvXDEubyAvZydgCm1vZHVsZV9saXN0X2xvPWBlY2hvICIkbW9kdWxlX2xpc3RfY29kZSAiIHwgc2VkICdzL1woW14gXVwpIC9cMS5sbyAvZydgCm1vZHVsZV9saXN0X2M9YGVjaG8gIiRtb2R1bGVfbGlzdF9jb2RlICIgfCBzZWQgJ3MvXChbXiBdXCkgL1wxLmMgL2cnYAoKbWliX21vZHVsZV9saXN0X289YGVjaG8gIiRtaWJfbW9kdWxlX2xpc3RfY29kZSAiIHwgc2VkICdzL1woW14gXVwpIC9cMS5vIC9nJ2AKbWliX21vZHVsZV9saXN0X2xvPWBlY2hvICIkbWliX21vZHVsZV9saXN0X2NvZGUgIiB8IHNlZCAncy9cKFteIF1cKSAvXDEubG8gL2cnYAptaWJfbW9kdWxlX2xpc3RfYz1gZWNobyAiJG1pYl9tb2R1bGVfbGlzdF9jb2RlICIgfCBzZWQgJ3MvXChbXiBdXCkgL1wxLmMgL2cnYAptaWJncm91cF9saXN0X289YGVjaG8gIiAkbWliX21vZHVsZV9saXN0X28gIiB8IHNlZCAnc0AgXChbXiBdKlwpXC5vQCBtaWJncm91cC9cMS5vIEBnJ2AKbWliZ3JvdXBfbGlzdF9sbz1gZWNobyAiICRtaWJfbW9kdWxlX2xpc3RfbG8gIiB8IHNlZCAnc0AgXChbXiBdKlwpXC5sb0AgbWliZ3JvdXAvXDEubG8gQGcnYAoKYWdlbnRfbW9kdWxlX2xpc3Rfbz1gZWNobyAiJGFnZW50X21vZHVsZV9saXN0X2NvZGUgIiB8IHNlZCAncy9cKFteIF1cKSAvXDEubyAvZydgCmFnZW50X21vZHVsZV9saXN0X2xvPWBlY2hvICIkYWdlbnRfbW9kdWxlX2xpc3RfY29kZSAiIHwgc2VkICdzL1woW14gXVwpIC9cMS5sbyAvZydgCmFnZW50X21vZHVsZV9saXN0X2M9YGVjaG8gIiRhZ2VudF9tb2R1bGVfbGlzdF9jb2RlICIgfCBzZWQgJ3MvXChbXiBdXCkgL1wxLmMgL2cnYAphZ2VudGdyb3VwX2xpc3Rfbz1gZWNobyAiICRhZ2VudF9tb2R1bGVfbGlzdF9vICIgfCBzZWQgJ3NAIFwoW14gXSpcKVwub0AgbWliZ3JvdXAvXDEubyBAZydgCmFnZW50Z3JvdXBfbGlzdF9sbz1gZWNobyAiICRhZ2VudF9tb2R1bGVfbGlzdF9sbyAiIHwgc2VkICdzQCBcKFteIF0qXClcLmxvQCBtaWJncm91cC9cMS5sbyBAZydgCmNoYW5nZXF1b3RlKFssIF0pCgppZiB0ZXN0ICRtb2R1bGVfZGVidWcgLWVxIDE7IHRoZW4KICAgZWNobyAtZSAiXG5GaW5hbCBtb2R1bGUgbGlzdDogJG1vZHVsZV9saXN0X2NvZGUiCiAgIGV4aXQKZmkKaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgogIEFDX01TR19DQUNIRV9BREQoW0FnZW50IE1vZHVsZSBsaXN0OiAkbW9kdWxlX2xpc3RfY29kZV0pCmZpCk1PRFVMRV9MSVNUPSRtb2R1bGVfbGlzdF9jb2RlCkFDX1NVQlNUKE1PRFVMRV9MSVNUKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9jKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9oKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9vKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9sbykKQUNfU1VCU1QobWliX21vZHVsZV9saXN0X2MpCkFDX1NVQlNUKG1pYl9tb2R1bGVfbGlzdF9oKQpBQ19TVUJTVChtaWJfbW9kdWxlX2xpc3RfbykKQUNfU1VCU1QobWliX21vZHVsZV9saXN0X2xvKQpBQ19TVUJTVChhZ2VudF9tb2R1bGVfbGlzdF9jKQpBQ19TVUJTVChhZ2VudF9tb2R1bGVfbGlzdF9oKQpBQ19TVUJTVChhZ2VudF9tb2R1bGVfbGlzdF9vKQpBQ19TVUJTVChhZ2VudF9tb2R1bGVfbGlzdF9sbykKQUNfU1VCU1QobWliZ3JvdXBfbGlzdF9vKQpBQ19TVUJTVChtaWJncm91cF9saXN0X2xvKQpBQ19TVUJTVChhZ2VudGdyb3VwX2xpc3RfbykKQUNfU1VCU1QoYWdlbnRncm91cF9saXN0X2xvKQpBQ19TVUJTVChtb2R1bGVfbGlzdCkKQUNfU1VCU1QobWliX21vZHVsZV9saXN0KQpBQ19TVUJTVChhZ2VudF9tb2R1bGVfbGlzdCkKQUNfU1VCU1QoZGVmYXVsdF9taWJzX2luc3RhbGwpCkFDX1NVQlNUKGRsbGNsZWFucykKQUNfU1VCU1RfRklMRShtb2R1bGVfcnVsZXMpCgpBQ19NU0dfUkVTVUxUKC4pCgppZiB0ZXN0ICRtb2R1bGVfZGVidWcgLWVxIDE7IHRoZW4KQUNfTVNHX0NBQ0hFX0FERChBZ2VudCBNSUIgY29kZTogICAgICAgICAgICAkbW9kdWxlX2xpc3QpCmZpCkFDX01TR19DQUNIRV9BREQoQWdlbnQgTUlCIGNvZGU6ICAgICAgICAgICAgJHRvcF9sZXZlbF9tb2R1bGVzKQoKIyBlbmQgaGFpcnkgYWdlbnQgbW9kdWxlIHByb2Nlc3NpbmcKCkFDX01TR19DSEVDS0lORyhbaWYgZGlyZWN0b3JpZXMgbmVlZCB0byBiZSBjcmVhdGVkXSkKZm9yIGkgaW4gJG1vZHVsZV9kaXJlY3RvcmllczsgZG8KICAkc3JjZGlyL21raW5zdGFsbGRpcnMgJGkKZG9uZQpBQ19NU0dfUkVTVUxUKC4pCgojLS0tLS0tLS0tLS0tLS0tLS0tLQojIERlZmluZSBkZWZhdWx0IG1pYnMKIwpBQ19NU0dfQ0hFQ0tJTkcoW2RlZmF1bHQgbWliIGZpbGVzIHRvIHJlYWRdKQppZiB0ZXN0ICJ4JE5FVFNOTVBfREVGQVVMVF9NSUJTIiA9ICJ4IjsgdGhlbgogIE5FVFNOTVBfREVGQVVMVF9NSUJTPSIkZGVmYXVsdF9taWJzIgpmaQppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgIyBtaW5ndzMyIGFuZCBjeWd3aW4gdXNlICc7JyBhcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2VwYXJhdG9yIGNoYXIKICBFTlZfU0VQQVJBVE9SPSI7IgogIE5FVFNOTVBfREVGQVVMVF9NSUJTPWBlY2hvICIkTkVUU05NUF9ERUZBVUxUX01JQlMiIHwgc2VkICdzLzovOy9nJ2AKICBkZWZhdWx0X21pYnM9YGVjaG8gIiRkZWZhdWx0X21pYnMiIHwgc2VkICdzLzovOy9nJ2AKZWxzZQogIEVOVl9TRVBBUkFUT1I9IjoiCmZpCkFDX1NVQlNUKEVOVl9TRVBBUkFUT1IpCkFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfTUlCUywiJE5FVFNOTVBfREVGQVVMVF9NSUJTIikKQUNfU1VCU1QoTkVUU05NUF9ERUZBVUxUX01JQlMpCkFDX01TR19SRVNVTFQoJE5FVFNOTVBfREVGQVVMVF9NSUJTKQoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHdlIGhhdmUgdG8gYnVpbGQgUElDIGNvZGVdKQplY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgdWNkLXNubXAvZGxtb2QgIiA+L2Rldi9udWxsCmlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCiAgICAgICAgTElCX0NGTEFHUz0iJExJQl9DRkxBR1MgJFNITElCX0NGTEFHUyIKCUFDX01TR19SRVNVTFQoeWVzKQplbHNlCglETExJQlM9IiIKCUFDX01TR19SRVNVTFQobm8pCmZpCgojCiMgQ2hlY2sgZm9yIGtlcm5lbCBsb2NhdGlvbgojCgpBQ19DQUNIRV9DSEVDSyhmb3IgbG9jYXRpb24gb2Ygc3lzdGVtIGtlcm5lbCxhY19jdl9LRVJORUxfTE9DLApbYWNfY3ZfS0VSTkVMX0xPQz0idW5rbm93biIKIyBGaXJzdCBkZXRlcm1pbmUgaWYgdGVzdCBleHBlY3RzIGEgLWYgb3IgYSAtYyAoY2hhcmFjdGVyIGRldmljZSAoU1lTVikpCgppZiB0ZXN0IC1jIC9kZXYvbnVsbDsgdGhlbgogIENGTEFHPSItYyIKZWxpZiB0ZXN0IC1mIC9kZXYvbnVsbDsgdGhlbgogIENGTEFHPSItZiIKZWxzZQogICMgZmFsbCBiYWNrCiAgQ0ZMQUc9Ii1mIgpmaQpmb3IgaSBpbiAvdm11bml4IC9ocC11eCAvc3RhbmQvdm11bml4IC9kZXYva3N5bXMgL2tlcm5lbC91bml4IC9rZXJuZWwvZ2VudW5peCAvbmV0YnNkIC91bml4IC9rZXJuZWwgL2JzZCAvbWFjaF9rZXJuZWwgL2Jvb3Qva2VybmVsL2tlcm5lbAogIGRvCiAgaWYgdGVzdCAtZiAkaSAtbyAkQ0ZMQUcgJGk7IHRoZW4KICAgIGFjX2N2X0tFUk5FTF9MT0M9IiRpIgogICAgYnJlYWs7CiAgZmkKZG9uZQppZiB0ZXN0ICRpID0gInVua25vd24iOyB0aGVuCiAgQUNfTVNHX1dBUk4oW0Nhbid0IGZpbmQgc3lzdGVtIGtlcm5lbC4uLiAgU2V0dGluZyB0byAvdm11bml4XSkKICBhY19jdl9LRVJORUxfTE9DPSIvdm11bml4IgpmaQpdKQoKQUNfREVGSU5FX1VOUVVPVEVEKEtFUk5FTF9MT0MsIiRhY19jdl9LRVJORUxfTE9DIikKCiMKIyBDaGVjayBmb3IgbW91bnQgdGFibGUgbG9jYXRpb24KIwoKQUNfQ0FDSEVfQ0hFQ0soZm9yIG1vdW50IHRhYmxlIGxvY2F0aW9uLGFjX2N2X0VUQ19NTlRUQUIsClthY19jdl9FVENfTU5UVEFCPSJ1bmtub3duIgpmb3IgaSBpbiAvZXRjL21udHRhYiAvZXRjL210YWIgL2V0Yy9maWxlc3lzdGVtcwogIGRvCiAgaWYgdGVzdCAtZiAkaTsgdGhlbgogICAgYWNfY3ZfRVRDX01OVFRBQj0iJGkiCiAgICBicmVhazsKICBmaQpkb25lCl0pCgpBQ19ERUZJTkVfVU5RVU9URUQoRVRDX01OVFRBQiwiJGFjX2N2X0VUQ19NTlRUQUIiKQoKIyBDaGVjayBmb3IgL2Rldi9kbWVtIG9yIC9kZXYvZHJ1bSBsb2NhdGlvbgpBQ19DQUNIRV9DSEVDSyhmb3IgbG9jYXRpb24gb2Ygc3dhcCBkZXZpY2UsYWNfY3ZfRE1FTV9MT0MsClsKIyBGaXJzdCBkZXRlcm1pbmUgaWYgdGVzdCBleHBlY3RzIGEgLWYgb3IgYSAtYyAoY2hhcmFjdGVyIGRldmljZSAoU1lTVikpCgppZiB0ZXN0IC1mIC9kZXYva21lbTsgdGhlbgogIENURVNUPSJ0ZXN0IC1mIgplbGlmIHRlc3QgLWMgL2Rldi9rbWVtOyB0aGVuCiAgQ1RFU1Q9InRlc3QgLWMiCmVsc2UKICAjIGZhbGwgYmFjawogIENURVNUPSJ0ZXN0IC1mIgpmaQoKaWYgJENURVNUIC9kZXYvZG1lbTsgdGhlbgogIGFjX2N2X0RNRU1fTE9DPSIvZGV2L2RtZW0iCmVsaWYgJENURVNUIC9kZXYvZHJ1bTsgdGhlbgogIGFjX2N2X0RNRU1fTE9DPSIvZGV2L2RydW0iCmVsc2UKICBhY19jdl9ETUVNX0xPQz0ibm9uZSIKZmkKXSkKCmlmIHRlc3QgIngkYWNfY3ZfRE1FTV9MT0MiICE9ICJ4bm9uZSI7IHRoZW4KICBBQ19ERUZJTkVfVU5RVU9URUQoRE1FTV9MT0MsIiRhY19jdl9ETUVNX0xPQyIpCmZpCgojIGZvcmNlZCBlZmVuY2UgdHVybmVkIG9mZi4KIyBpZiB0ZXN0ICJ4JGRldmVsb3BlciIgPSAieHllcyIgLWEgIngkdXNlX2VmZW5jZSIgIT0gInhubyI7IHRoZW4KIyAgICB1c2VfZWZlbmNlPSJ5ZXMiCiMgZmkKCmlmIHRlc3QgIngkdXNlX2VmZW5jZSIgPSAieHllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0xJQihlZmVuY2UsIEVGX0V4aXQpCmZpCgojIENoZWNrcyBmb3IgbGlicmFyaWVzLgojIEFDX0NIRUNLX0xJQihkZXMsIG1haW4pCkFDX0NIRUNLX0xJQihtLCBhc2luKQoKQUNfQVJHX1dJVEgoZWxmLAoJW0FTX0hFTFBfU1RSSU5HKC0td2l0aG91dC1lbGYsW3VzZSBlbGYgbGlicmFyaWVzXSldLCwKCVtBQ19BUkdfRU5BQkxFKGVsZiwsCgkJW0FDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWVsZi8tLXdpdGgtb3V0LWVsZiBpbnN0ZWFkIF0pXSldKQoKaWYgdGVzdCAieCR3aXRoX2VsZiIgIT0gInhubyI7IHRoZW4KIyBubGlzdCBpcyBuZWVkZWQgZm9yIHVwdGltZSBvbiBzb21lIHN5dGVtcyBpbiB0aGUgZ2VuZXJpYyBsaWJyYXJ5CiMgYWRkIGhvc3RzIHdoaWNoIGRvbid0IHVzZSBubGlzdCB0byB0aGUgYmxhbmsgZmlyc3QgbGluZQpjYXNlICR0YXJnZXRfb3MgaW4KCWxpbnV4KikgOzsKCWlyaXgqKSAjIENoZWNrIGZvciBubGlzdCBpbiBtbGQgKGlyaXgpCgkJQUNfQ0hFQ0tfTElCKGVsZiwgbmxpc3QpCgkJQUNfQ0hFQ0tfTElCKG1sZCwgbmxpc3QpCgkJOzsKCSopICMgZGVmYXVsdAoJCUFDX0NIRUNLX0xJQihlbGYsIG5saXN0KQoJCTs7CmVzYWMKZmkKIAoKIyBPbiBzb21lIHBsYXRmb3JtcyAoSXJpeCkgbGlibnNsIGFuZCBsaWJzb2NrZXQgc2hvdWxkIG5vdCBiZSB1c2VkLgpBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUsIEFDX0RFRklORShIQVZFX0dFVEhPU1RCWU5BTUUpLAoJQUNfQ0hFQ0tfTElCKG5zbCwgZ2V0aG9zdGJ5bmFtZSwgQUNfREVGSU5FKEhBVkVfR0VUSE9TVEJZTkFNRSkKCUxJQlM9IiR7TElCU30gLWxuc2wiKSkKCiMgU0NPIFVuaXh3YXJlIDcuMS40IGZpbmRzIGdldGhvc3RieW5hbWUoKSBpbiAtbHNvY2tldApBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUsIEFDX0RFRklORShIQVZFX0dFVEhPU1RCWU5BTUUpLAoJQUNfQ0hFQ0tfTElCKHNvY2tldCwgZ2V0aG9zdGJ5bmFtZSwgQUNfREVGSU5FKEhBVkVfR0VUSE9TVEJZTkFNRSkKCUxJQlM9IiR7TElCU30gLWxzb2NrZXQiKSkKCkFDX0NIRUNLX0ZVTkMoZ2V0c2VydmJ5bmFtZSwgQUNfREVGSU5FKEhBVkVfR0VUU0VSVkJZTkFNRSksCglBQ19DSEVDS19MSUIoc29ja2V0LCBnZXRzZXJ2YnluYW1lLCBBQ19ERUZJTkUoSEFWRV9HRVRTRVJWQllOQU1FKQoJTElCUz0iJHtMSUJTfSAtbHNvY2tldCIpKQoKIyBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gLWxrc3RhdDoKQUNfQ0hFQ0tfTElCKGtzdGF0LCBrc3RhdF9sb29rdXApCgojIENoZWNrIGZvciBzZWN1cml0eSByZWxhdGVkIGZ1bmN0aW9ucwppZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiICE9ICJ4bm8iOyB0aGVuCiAgICBpZiB0ZXN0ICJ4JGFza2Vkb3BlbnNzbCIgIT0gInh5ZXMiIC1hICJ4JGFza2VkcGtjcyIgPSAieHllcyI7IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKHBrY3MxMSwgQ19Jbml0aWFsaXplKQogICAgZWxzZSAKICAgICAgaWYgdGVzdCAieCR0cnlyc2FyZWYiICE9ICJ4bm8iOyB0aGVuCiAgICAgICAgIEFDX0NIRUNLX0xJQihyc2FyZWYsIFJTQVByaXZhdGVEZWNyeXB0KQogICAgICAgICBBQ19DSEVDS19MSUIoUlNBZ2x1ZSwgUlNBX1BLQ1MxX1JTQXJlZikKICAgICAgZmkKCiAgICAgIEFDX0NIRUNLX0xJQihjcnlwdG8sIEVWUF9tZDUpCiAgICAgIEFDX0NIRUNLX0ZVTkNTKEFFU19jZmIxMjhfZW5jcnlwdCkKICAgIGZpCmVsaWYgdGVzdCAieCRhc2tlZHBrY3MiID0gInh5ZXMiOyB0aGVuCiAgICBBQ19DSEVDS19MSUIocGtjczExLCBDX0luaXRpYWxpemUpCmZpCgojIENoZWNrIGZvciBsaWJyYXJpZXMgdGhhdCB0aGUgYWdlbnQgbmVlZHMKIyBzYXZpbmcgb2xkIGxpYnJhcmllcwpOT05BR0VOVExJQlM9JExJQlMKCiMgY2hlY2sgZm9yIHRjcCB3cmFwcGVyIHN1cHBvcnQKX2NwcGZsYWdzPSIke0NQUEZMQUdTfSIKX2xkZmxhZ3M9IiR7TERGTEFHU30iCgpBQ19BUkdfV0lUSChsaWJ3cmFwLApbICAtLXdpdGgtbGlid3JhcFs9TElCUEFUSF0gIENvbXBpbGUgaW4gbGlid3JhcCAodGNwX3dyYXBwZXJzKSBzdXBwb3J0Ll0sWwogIGlmIHRlc3QgIiR3aXRoX2xpYndyYXAiICE9ICJubyI7IHRoZW4KICAgIGlmIHRlc3QgIiR3aXRoX2xpYndyYXAiICE9ICJ5ZXMiOyB0aGVuCiAgICAgIENQUEZMQUdTPSIke0NQUEZMQUdTfSAtSSR3aXRoX2xpYndyYXAvaW5jbHVkZSIKICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAtTCR3aXRoX2xpYndyYXAvbGliIgogICAgZmkKCiAgICBfbGlicz0ke0xJQlN9CiAgICBBQ19DSEVDS19IRUFERVIodGNwZC5oLCAsCgkgICAgQUNfTVNHX0VSUk9SKFtBc2tlZCB0byB1c2UgbGlid3JhcCBidXQgSSBjb3VsZG4ndCBmaW5kIHRjcGQuaC5dKSkKCiAgICBMSUJTPSIkTElCUyAtbHdyYXAiCglBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUQ1Agd3JhcHBlcnMgbGlicmFyeSAtbHdyYXBdKQoJQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCQkgICAgICNpbmNsdWRlIDx0Y3BkLmg+CgkJICAgICBpbnQgYWxsb3dfc2V2ZXJpdHkgPSAwOwoJCSAgICAgaW50IGRlbnlfc2V2ZXJpdHkgID0gMDsKCQkgICAgXSxbaG9zdHNfYWNjZXNzKCh2b2lkICopMCldLFsKCgkgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKCSAgICBBQ19ERUZJTkUoTkVUU05NUF9VU0VfTElCV1JBUCkKCSAgICB0ZXN0ICIkd2l0aF9saWJ3cmFwIiAhPSBubyAtYSAiJHdpdGhfbGlid3JhcCIgIT0geWVzICYmIFdSQVBMSUJTPSItTCR3aXRoX2xpYndyYXAvbGliIgoJICAgIFdSQVBMSUJTPSIkV1JBUExJQlMgLWx3cmFwIl0sCiAgICAgICAgWwoJICAgIEFDX01TR19SRVNVTFQoW25vXSkKCSAgICAjIExpbnV4IFJlZEhhdCA2LjEgd29uJ3QgbGluayBsaWJ3cmFwIHdpdGhvdXQgbGlibnNsCgkgICAgQUNfQ0hFQ0tfRlVOQyh5cF9nZXRfZGVmYXVsdF9kb21haW4sICwKCQlBQ19DSEVDS19MSUIobnNsLCB5cF9nZXRfZGVmYXVsdF9kb21haW4pKQoJICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRDUCB3cmFwcGVycyBsaWJyYXJ5IC1sd3JhcCBsaW5rZWQgd2l0aCAtbG5zbF0pCgkgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCQkgICAgICAgICAjaW5jbHVkZSA8dGNwZC5oPgoJCSAgICAgICAgIGludCBhbGxvd19zZXZlcml0eSA9IDA7CgkgICAgICAgICAgICAgICAgIGludCBkZW55X3NldmVyaXR5ICA9IDA7CgkgCQldLFtob3N0c19hY2Nlc3MoKHZvaWQgKikwKV0sCgoJCQlBQ19NU0dfUkVTVUxUKHllcykKCQkJQUNfREVGSU5FKE5FVFNOTVBfVVNFX0xJQldSQVApCgkJCXRlc3QgIiR3aXRoX2xpYndyYXAiICE9IG5vIC1hICIkd2l0aF9saWJ3cmFwIiAhPSB5ZXMgJiYgV1JBUExJQlM9Ii1MJHdpdGhfbGlid3JhcC9saWIiCgkJCVdSQVBMSUJTPSIkV1JBUExJQlMgLWx3cmFwIC1sbnNsIiwKCgkJCUFDX01TR19SRVNVTFQobm8pCgkJCUFDX01TR19FUlJPUihBc2tlZCB0byB1c2UgbGlid3JhcCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0LikpXSkKICAgIENQUEZMQUdTPSR7X2NwcGZsYWdzfQogICAgTERGTEFHUz0ke19sZGZsYWdzfQogICAgTElCUz0ke19saWJzfQogIGZpCl0pCgpBQ19DSEVDS19IRUFERVJTKHJwbS9ycG1saWIuaCBycG0vaGVhZGVyLmgpCgpBQ19DSEVDS19IRUFERVIocnBtL3JwbWxpYi5oLHJwbWxpYl9oPXllcyxycG1saWJfaD1ubykKQUNfQ0hFQ0tfSEVBREVSKHJwbS9oZWFkZXIuaCxycG1oZWFkZXJfaD15ZXMscnBtaGVhZGVyX2g9bm8pCgppZiB0ZXN0ICJ4JHJwbWhlYWRlcl9oIiA9ICJ4bm8iIC1vICJ4JHJwbWxpYl9oIiA9ICJ4bm8iIDsgdGhlbgogIGlmIHRlc3QgIngkd2l0aF9ycG0iID0gInh5ZXMiIDsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBlaXRoZXIgdGhlIFJQTSBoZWFkZXIgZmlsZXMgbmVlZGVkIGFuZCB3YXMgc3BlY2lmaWNhbGx5IGFza2VkIHRvIHVzZSBSUE0gc3VwcG9ydF0pCiAgZWxzZQogICAgd2l0aF9ycG09bm8KICBmaQpmaQoKIwojIHJwbSBsaWJyYXJpZXMgb25seSBuZWVkZWQgZm9yIHRoZSBob3N0IHJlc291cmNlcyBtaWIgc29mdHdhcmUKIyBpbnN0YWxsZWQgdGFibGVzIChvbiBsaW51eCBpbiBwYXJ0aWN1bGFyKQojCmlmIHRlc3QgIngkd2l0aF9ycG0iICE9ICJ4bm8iICYmIFwKICAgICAgICBlY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgaG9zdC9ocl9zd2luc3QgIiA+IC9kZXYvbnVsbDsgdGhlbgogICMgQVJHLiAgUlBNIGlzIGEgcmVhbCBwYWluLgogICMgRldJVyBsaWJycG0ubGEsIGxpYnJwbWlvLmxhLCBhbmQgbGlicG9wdC5sYSBoYXZlIGNvcnJlY3QgZGVwZW5kZW5jaWVzLgogIF9ycG1saWJzPSIiCgogICMgemxpYiBpcyByZXF1aXJlZCBmb3IgbmV3ZXIgdmVyc2lvbnMgb2YgcnBtCiAgX2NwcGZsYWdzPSIke0NQUEZMQUdTfSIKICBfbGRmbGFncz0iJHtMREZMQUdTfSIKCiAgQUNfQVJHX1dJVEgoemxpYiwKICBbICAtLXdpdGgtemxpYls9RElSXSAgICAgICAgIHVzZSBsaWJ6IGluIERJUl0sWwogICAgaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIENQUEZMQUdTPSIke0NQUEZMQUdTfSAtSSR3aXRodmFsL2luY2x1ZGUiCiAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLUwkd2l0aHZhbC9saWIiCiAgICBmaQogIF0pCgogICMgZHVubm8gaWYgdGhpcyBpcyBuZWVkZWQgZm9yIHJwbS00LjAueCwgZWFybGllciBwcm9iYWJseSBuZWVkcy4KICBBQ19DSEVDS19IRUFERVIoemxpYi5oLAogICAgICBBQ19DSEVDS19MSUIoeiwgZ3pyZWFkLCAsIENQUEZMQUdTPSR7X2NwcGZsYWdzfSBMREZMQUdTPSR7X2xkZmxhZ3N9KSwKICAgICAgQ1BQRkxBR1M9JHtfY3BwZmxhZ3N9IExERkxBR1M9JHtfbGRmbGFnc30pCgogICMgdHdvIHZhcmlhbnRzIG9mIGJ6aXAyIG5lZWQgY2hlY2tpbmcuCiAgQUNfQVJHX1dJVEgoYnppcDIsCiAgWyAgLS13aXRoLWJ6aXAyWz1ESVJdICAgICAgICB1c2UgbGliYnoyIGluIERJUl0sWwogICAgaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIENQUEZMQUdTPSIke0NQUEZMQUdTfSAtSSR3aXRodmFsL2luY2x1ZGUiCiAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLUwkd2l0aHZhbC9saWIiCiAgICBmaQogICAgaWYgdGVzdCAieCR3aXRoX2J6aXAyIiAhPSAieG5vIjsgdGhlbgogIEFDX0NIRUNLX0xJQihiejIsIGJ6cmVhZCwgW19ycG1saWJzPSIkX3JwbWxpYnMgLWxiejIiXSwKICAgICBBQ19DSEVDS19MSUIoYnoyLCBCWjJfYnpyZWFkLCBbX3JwbWxpYnM9IiRfcnBtbGlicyAtbGJ6MiJdLCkpCiAgICBmaQogIF0pCgoKICAjIHR3byB2YXJpYW50cyBvZiBkYjEgbmVlZCBjaGVja2luZy4KICBBQ19DSEVDS19MSUIoZGIxLCBkYm9wZW4sIFtfcnBtbGlicz0iLWxkYjEgJF9ycG1saWJzIl0sCiAgICAgQUNfQ0hFQ0tfTElCKGRiLCBkYm9wZW4sIFtfcnBtbGlicz0iLWxkYiAkX3JwbWxpYnMiXSkpCgogICMgdHdvIHZhcmlhbnRzIG9mIGRiMyBuZWVkIGNoZWNraW5nLgogIEFDX0NIRUNLX0xJQihkYi0zLjEsIGRiX2NyZWF0ZSwgW19ycG1saWJzPSItbGRiLTMuMSAkX3JwbWxpYnMiXSwKICAgIEFDX0NIRUNLX0xJQihkYi0zLjAsIGRiX2NyZWF0ZSwgW19ycG1saWJzPSItbGRiLTMuMCAkX3JwbWxpYnMiXSkpCiAgCiAgIyBycG0tMy4wLjUgYW5kIGxhdGVyIG5lZWRzIHBvcHQuCiAgQUNfQ0hFQ0tfTElCKHBvcHQsIHBvcHRQYXJzZUFyZ3ZTdHJpbmcsIFtfcnBtbGlicz0iLWxwb3B0ICRfcnBtbGlicyJdKQogIAogICMgcnBtLTQuMC54IG5lZWRzIHJwbWlvLgogIEFDX0NIRUNLX0xJQihycG1pbywgRm9wZW4sIFtfcnBtbGlicz0iLWxycG1pbyAkX3JwbWxpYnMiXSwsJF9ycG1saWJzKQogIAogICMgbm93IGNoZWNrIGZvciBycG0gdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGxpYnJhcmllcy4KICBBQ19DSEVDS19MSUIocnBtLCBycG1HZXRGaWxlc3lzdGVtTGlzdCxbCiAgICBBQ19ERUZJTkUoSEFWRV9MSUJSUE0pCiAgICBMSUJTPSItbHJwbSAkX3JwbWxpYnMgJExJQlMiCiAgICBDRkxBR1M9IiRDRkxBR1MgLUkvdXNyL2luY2x1ZGUvcnBtIgogIF0sWwogICAgIyBycG0tNC4wLjMgbGlicnBtZGIgYWN0dWFsbHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLgogICAgQUNfQ0hFQ0tfTElCKHJwbWRiLCBycG1kYk9wZW4sWwogICAgICBBQ19ERUZJTkUoSEFWRV9MSUJSUE0pCiAgICAgIExJQlM9Ii1scnBtZGIgLWxycG0gJF9ycG1saWJzICRMSUJTIgogICAgICBDRkxBR1M9IiRDRkxBR1MgLUkvdXNyL2luY2x1ZGUvcnBtIgogICAgXSwsLWxycG0gJF9ycG1saWJzKQogIF0pCmZpCiAgCiMgUmVwbGFjZSBgbWFpbicgd2l0aCBhIGZ1bmN0aW9uIGluIC1sa3ZtOgpBQ19DSEVDS19MSUIoa3ZtLCBrdm1fcmVhZCkKIyBEWU5BTUlDIE1PRFVMRSBTVVBQT1JUCkFDX0NIRUNLX0xJQihkbCwgZGxvcGVuKQpBQ19DSEVDS19GVU5DUyhkbG9wZW4pCgpBQ19DSEVDS19GVU5DUyhrdm1fb3BlbmZpbGVzIG5saXN0IGtubGlzdCBrdm1fZ2V0cHJvY3Mga3ZtX2dldHN3YXBpbmZvKQplY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgdWNkLXNubXAvZGlza2lvICIgPi9kZXYvbnVsbAojIHdoZXRoZXIgd2UgbmVlZCAtbGRldnN0YXQgZm9yIGRpc2tpbyBNSUIKaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KCUFDX0NIRUNLX0ZVTkMoZ2V0ZGV2cywgQUNfREVGSU5FKEhBVkVfR0VUREVWUyksCgkJQUNfQ0hFQ0tfTElCKGRldnN0YXQsIGdldGRldnMsIEFDX0RFRklORShIQVZFX0dFVERFVlMpCgkJTElCUz0iJHtMSUJTfSAtbGRldnN0YXQiKSkKCUFDX0NIRUNLX0ZVTkMoZ2V0ZGV2cywgQUNfREVGSU5FKEhBVkVfREVWU1RBVF9HRVRERVZTKSwKCQlBQ19DSEVDS19MSUIoZGV2c3RhdCwgZGV2c3RhdF9nZXRkZXZzLCBBQ19ERUZJTkUoSEFWRV9ERVZTVEFUX0dFVERFVlMpCgkJTElCUz0iJHtMSUJTfSAtbGRldnN0YXQiKSkKZmkKCiMgTE0tU0VOU09SUy1NSUIgc3VwcG9ydAplY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgdWNkLXNubXAvbG1TZW5zb3JzICIgPiAvZGV2L251bGwKaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzZW5zb3JzIHN1cHBvcnRdKQogICAgICAgIGNhc2UgJHRhcmdldF9vcyBpbgogICAgICAgICAgc29sYXJpcyopCiAgICAgICAgICAgIEFDX0NIRUNLX0hFQURFUihwaWNsLmgsTElCUz0iJHtMSUJTfSAtbHBpY2wiLCkKICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhwaWNsLmgpCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKHNlbnNvcnMvc2Vuc29ycy5oLCwKICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2Fza2VkIHRvIHVzZSBsbV9zZW5zb3JzIGJ1dCBJIGNvdWxkbid0IGZpbmQgc2Vuc29ycy9zZW5zb3JzLmhdKV0pCiAgICAgICAgICAgIEFDX0NIRUNLX0xJQihzZW5zb3JzLCBzZW5zb3JzX2dldF9kZXRlY3RlZF9jaGlwcywgU0VOU09STElCUz0iLWxzZW5zb3JzIiwKICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2Fza2VkIHRvIHVzZSBsbV9zZW5zb3JzIGJ1dCBJIGNvdWxkbid0IGZpbmQgLWxzZW5zb3JzXSldKQogICAgICAgICAgICA7OwogICAgICAgIGVzYWMKZmkKQUNfU1VCU1QoU0VOU09STElCUykKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBQRVJMIFNVUFBPUlQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIwojIHRlc3QgdG8gc2VlIGlmIHdlIGNhbiBhdHRlbXB0IHRvIGJ1aWxkIGVtYmVkZGVkIHBlcmwgc28gZmFyCiMKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieG5vIiA7IHRoZW4KICAgIGluc3RhbGxfcGVybD0idHJ5IgogIGZpCiAgaWYgdGVzdCAieCRhY19jdl9wYXRoX1BFUkxQUk9HIiA9ICJ4IiAtbyAieCRhY19jdl9wYXRoX1BFUkxQUk9HIiA9ICJ4bm8iIDsgdGhlbgogICAgaW5zdGFsbF9wZXJsPSJubyIKICAgIGVtYmVkX3Blcmw9Im5vIgogIGZpCmZpCgoKIwojIEVtYmVkZGVkIFBlcmwgc3BlY2lmaWMgc3R1ZmYKIwoKIyB0ZXN0IHBlcmwgcHJvZwppZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgIT0gInhubyIgOyB0aGVuCiAgICBteXBlcmw9JGFjX2N2X3BhdGhfUEVSTFBST0cKICAgIGlmIHRlc3QgJG15cGVybCA9ICJubyIgOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKC0tZW5hYmxlLWVtYmVkZGVkLXBlcmwgcmVxdWVzdGVkIGJ1dCBubyBwZXJsIGV4ZWN1dGFibGUgZm91bmQpCiAgICAgIGZpCiAgICBmaQpmaQoKIyB0ZXN0IGZvciBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgIyBlbWJlZGRlZCBwZXJsIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJpZXMKICAgIGlmIHRlc3QgIngkZW5hYmxlX3NoYXJlZCIgIT0gInh5ZXMiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKHBlcmwgc3VwcG9ydCByZXF1aXJlcyAtLWVuYWJsZS1zaGFyZWQpCiAgICAgIGZpCiAgICBmaQpmaQoKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbaWYgd2UgYXJlIGluIHRoZSBzb3VyY2UgdHJlZSBzbyB3ZSBjYW4gaW5zdGFsbCBwZXJsIG1vZHVsZXNdKQogIGlmIHRlc3QgIngkc3JjZGlyIiA9ICJ4LiIgLW8gLWQgcGVybC9hZ2VudC9kZWZhdWx0X3N0b3JlIDsgdGhlbgogICAgQUNfTVNHX1JFU1VMVChbWWVzXSkKICBlbHNlCiAgICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgIGluc3RhbGxfcGVybD0ibm8iCiAgICAgIEFDX01TR19SRVNVTFQoW05vXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX0VSUk9SKFtwZXJsIG1vZHVsZXMgY2FuIG5vdCBiZSBidWlsdCBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5XSkKICAgIGZpCiAgZmkKZmkgICAgICAKCiMgY2hlY2sgdGhlIHBlcmwgY29tcGlsZXIgbmFtZQppZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgIT0gInhubyIgOyB0aGVuCiAgICAjCiAgICAjIHBlcmwgY2MgY2hlY2tzCiAgICAjCiAgICBpZiB0ZXN0ICJ4ZW5hYmxlX3BlcmxfY2NfY2hlY2tzIiAhPSAieG5vIiA7IHRoZW4KICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcGVybCBjY10pCiAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBQRVJMQ0M9YCRteXBlcmwgLVY6Y2MgfCAkbXlwZXJsIC1uIC1lICdwcmludCBpZiAocy9eXHMqY2M9LihbLVx3XHNdKykuO1xzKi8kMS8pOydgCiAgICAgIGNoYW5nZXF1b3RlKFssIF0pCiAgICAgIGlmIHRlc3QgIngkUEVSTENDIiAhPSAieCIgOyB0aGVuCiAgICAgICAgQUNfTVNHX1JFU1VMVChbJFBFUkxDQ10pCiAgICAgIGVsc2UKICAgICAgICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAgIGVsc2UKICAgICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGRldGVybWluZSB0aGUgY29tcGlsZXIgdGhhdCB3YXMgdXNlZCB0byBidWlsZCAkbXlwZXJsLiBFaXRoZXIgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQRVJMUFJPRyB0byBhIGRpZmZlcmVudCBwZXJsIGJpbmFyeSBvciB1c2UgLS1kaXNhYmxlLWVtYmVkZGVkLXBlcmwgdG8gdHVybiBvZmYgZW1iZWRkZWQgcGVybCBmdW5jdGlvbmFsaXR5IGFsdG9nZXRoZXIuXSkKICAgICAgICBmaQogICAgICBmaQpmaQoKIyBjaGVjayB0aGUgcGVybCBjb21waWxlciBjb21wYXRpYmlsaXR5CmlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICRQRVJMQ0MgaXMgYSBHTlUgQyBjb21waWxlcl0pCiAgICAgIE9MRENDPSRDQwogICAgICBDQz0iJFBFUkxDQyIKICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW1sKI2lmbmRlZiBfX0dOVUNfXwogIGNob2tlIG1lCiNlbmRpZgogICAgICBdXSldLCBbcGVybGNjX2lzX2dudT15ZXNdLCBbcGVybGNjX2lzX2dudT1ub10pCiAgICAgIEFDX01TR19SRVNVTFQoWyRwZXJsY2NfaXNfZ251XSkKICAgICAgQ0M9JE9MRENDCiAgICAgIGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIiAtYSAieCRwZXJsY2NfaXNfZ251IiA9ICJ4bm8iIDsgdGhlbgogICAgICAJaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAJICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAJZWxzZQogICAgICAJICBBQ19NU0dfRVJST1IoW1RoaXMgYnVpbGQgaXMgdXNpbmcgYSBHTlUgQyBjb21waWxlciAoJENDKSB3aGlsZSBQZXJsIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggYSBub24tR05VIChvciBub24td29ya2luZykgY29tcGlsZXIgKCRQRVJMQ0MpLiBUaGlzIGxpa2VseSB3b24ndCB3b3JrIGZvciBlbWJlZGRlZCBwZXJsIHN1cHBvcnQuIEVpdGhlciBzcGVjaWZ5IGEgZGlmZmVyZW50IGNvbXBpbGVyICgtLXdpdGgtY2M9UEFUSCksIGRpc2FibGUgdGhpcyBjaGVjayAoLS1kaXNhYmxlLXBlcmwtY2MtY2hlY2tzKSBvciBkaXNhYmxlIGVtYmVkZGVkIHBlcmwgZnVuY3Rpb25hbGl0eSBhbHRvZ2V0aGVyICgtLWRpc2FibGUtZW1iZWRkZWQtcGVybCkuXSkKICAgICAgCWZpCiAgICAgIGZpCmZpCgojIGNoZWNrIGlmIHRoZXkncmUgYm90aCBnbnUKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JEdDQyIgIT0gInh5ZXMiIC1hICJ4JHBlcmxjY19pc19nbnUiID0gInh5ZXMiIDsgdGhlbgogICAgICAJaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAJICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAJZWxzZQogICAgICAgICAgQUNfTVNHX0VSUk9SKFtUaGlzIGJ1aWxkIGlzIHVzaW5nIGEgbm9uLUdOVSBDIGNvbXBpbGVyICgkQ0MpIHdoaWxlIFBlcmwgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciAoJFBFUkxDQykuIFRoaXMgbGlrZWx5IHdvbid0IHdvcmsgZm9yIGVtYmVkZGVkIHBlcmwgc3VwcG9ydC4gRWl0aGVyIHNwZWNpZnkgYSBkaWZmZXJlbnQgY29tcGlsZXIgKC0td2l0aC1jYz1QQVRIKSwgZGlzYWJsZSB0aGlzIGNoZWNrICgtLWRpc2FibGUtcGVybC1jYy1jaGVja3MpIG9yIGRpc2FibGUgZW1iZWRkZWQgcGVybCBmdW5jdGlvbmFsaXR5IGFsdG9nZXRoZXIgKC0tZGlzYWJsZS1lbWJlZGRlZC1wZXJsKS5dKQogICAgICAJZmkKICAgICAgZmkKZmkKCiMgd2UgaGF2ZSBlbm91Z2ggc3VwcG9ydCBmb3IgaW5zdGFsbGluZyB0aGUgbW9kdWxlcyBhdCBsZWFzdC4KaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogIGluc3RhbGxfcGVybD0ieWVzIgplbHNlCiAgaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInhubyIgOyB0aGVuCiAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgZW1iZWRfcGVybD0ibm8iCiAgZmkKZmkKCiMgb24gdG8gZW1iZWRkaW5nLi4uCiMgY2hlY2sgdGhlIGNmbGFncwppZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcGVybCBDRkxBR1NdKQogICAgcGVybGNmbGFncz1gJG15cGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHNgCiAgICBpZiB0ZXN0ICJ4JHBlcmxjZmxhZ3MiICE9ICJ4IiA7IHRoZW4KICAgICAgQUNfTVNHX1JFU1VMVChbJHBlcmxjZmxhZ3NdKQogICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRwZXJsY2ZsYWdzIgogICAgZWxzZQogICAgICBpZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAgIGVtYmVkX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBDIGNvbXBpbGVyIGZsYWdzIHRoYXQgd2VyZSB1c2VkIHRvIGJ1aWxkICRteXBlcmwuIEVpdGhlciBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFBFUkxQUk9HIHRvIGEgZGlmZmVyZW50IHBlcmwgYmluYXJ5IG9yIHVzZSAtLWRpc2FibGUtZW1iZWRkZWQtcGVybCB0byB0dXJuIG9mZiBlbWJlZGRlZCBwZXJsIGZ1bmN0aW9uYWxpdHkgYWx0b2dldGhlci5dKQogICAgICBmaQogICAgZmkKZmkKCiMgY2hlY2sgdGhlIGxkZmxhZ3MKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHBlcmwgTERGTEFHU10pCiAgICBwZXJsbGRvcHRzPWAkbXlwZXJsIC1NRXh0VXRpbHM6OkVtYmVkIC1lIGxkb3B0c2AKICAgIGlmIHRlc3QgIngkcGVybGxkb3B0cyIgIT0gIngiIDsgdGhlbgogICAgICBBQ19NU0dfUkVTVUxUKFskcGVybGxkb3B0c10pCiAgICAgIFBFUkxMRE9QVFM9IiRwZXJsbGRvcHRzIgogICAgZWxzZQogICAgICBpZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAgIGVtYmVkX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBsaW5rZXIgb3B0aW9ucyB0aGF0IHdlcmUgdXNlZCB0byBidWlsZCAkbXlwZXJsLiBFaXRoZXIgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQRVJMUFJPRyB0byBhIGRpZmZlcmVudCBwZXJsIGJpbmFyeSBvciB1c2UgLS1kaXNhYmxlLWVtYmVkZGVkLXBlcmwgdG8gdHVybiBvZmYgZW1iZWRkZWQgcGVybCBmdW5jdGlvbmFsaXR5IGFsdG9nZXRoZXIuXSkKICAgICAgZmkKICAgIGZpCmZpCgojIGNoZWNrIG5lZWRlZCBmdW5jdGlvbnMKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgIE9MRExERkxBR1M9IiRMREZMQUdTIgogICAgTERGTEFHUz0iJExERkxBR1MgJFBFUkxMRE9QVFMiCgogICAgIyBuZXdlciBwZXJsIHZzIG9sZGVyIHBlcmwgY2FsbCBmdW5jdGlvbnMKICAgIEFDX0NIRUNLX0ZVTkNTKGV2YWxfcHYpCgogICAgIyBzaWdoOiB0aGlzIGhhcyBhIENBUElUQUwgUCBpbiBwZXJsLCB3aGljaCBlbmRzIHVwIGJlaW5nIHRoZSBzYW1lCiAgICAjIGF1dG9jb25mIGRlZmluZSBhcyB0aGUgbG93ZXIgY2FzZSBzbyB3ZSBoYXZlIHRvIHRyZWF0IHRoZW0gKkJPVEgqCiAgICAjIHNwZWNpYWxseS4gIFdvbmRlcmZ1bC4KICAgIEFDX0NIRUNLX0ZVTkMocGVybF9ldmFsX3B2LCBBQ19ERUZJTkUoSEFWRV9QRVJMX0VWQUxfUFZfTEMpKQogICAgQUNfQ0hFQ0tfRlVOQyhQZXJsX2V2YWxfcHYsIEFDX0RFRklORShIQVZFX1BFUkxfRVZBTF9QVl9VQykpCgogICAgTERGTEFHUz0iJE9MRExERkxBR1MiCgoKICAgIGlmIHRlc3QgIngkYWNfY3ZfZnVuY19wZXJsX2V2YWxfcHYiICE9ICJ4eWVzIiAtYSAieCRhY19jdl9mdW5jX1BlcmxfZXZhbF9wdiIgIT0gInh5ZXMiIC1hICJ4JGFjX2N2X2Z1bmNfZXZhbF9wdiIgIT0gInh5ZXMiIDsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAgIGVtYmVkX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCB0aGUgZXZhbF9wdiwgcGVybF9ldmFsX3B2IG9yIFBlcmxfZXZhbF9wdiBmdW5jdGlvbnMgbmVlZGVkIGZvciBlbWJlZGRlZCBwZXJsIHN1cHBvcnQuIEVpdGhlciBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFBFUkxQUk9HIHRvIGEgZGlmZmVyZW50IHBlcmwgYmluYXJ5IG9yIHVzZSAtLWRpc2FibGUtZW1iZWRkZWQtcGVybCB0byB0dXJuIG9mZiBlbWJlZGRlZCBwZXJsIGZ1bmN0aW9uYWxpdHkgYWx0b2dldGhlci5dKQogICAgICBmaQogICAgZWxzZQogICAgICBBQ19ERUZJTkUoTkVUU05NUF9FTUJFRERFRF9QRVJMKQogICAgICBPVEhFUkFHRU5UTElCT0JKUz0ic25tcF9wZXJsLm8iCiAgICAgIE9USEVSQUdFTlRMSUJMT0JKUz0ic25tcF9wZXJsLmxvIgoKICAgICAgRU1CRURQRVJMSU5TVEFMTD0iZW1iZWRwZXJsaW5zdGFsbCIKICAgICAgRU1CRURQRVJMVU5JTlNUQUxMPSJlbWJlZHBlcmx1bmluc3RhbGwiCiAgICAgICMgeWF5LCB3ZSBnb3QgaGVyZSEKICAgICAgZW1iZWRfcGVybD0ieWVzIgogICAgZmkKZWxzZQogICAgICBFTUJFRFBFUkxJTlNUQUxMPSIiCiAgICAgIEVNQkVEUEVSTFVOSU5TVEFMTD0iIgogICAgICBlbWJlZF9wZXJsPSJubyIKICAgIGZpCmZpCkFDX1NVQlNUKEVNQkVEUEVSTElOU1RBTEwpCkFDX1NVQlNUKEVNQkVEUEVSTFVOSU5TVEFMTCkKQUNfU1VCU1QoUEVSTExET1BUUykKCiMgZW1iZWRkZWQgcGVybCByZXN1bHRzCkFDX01TR19DSEVDS0lORyhbRm9yIHBvdGVudGlhbCBlbWJlZGRlZCBwZXJsIHN1cHBvcnRdKQppZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiICE9ICJ4eWVzIiA7IHRoZW4KICBBQ19NU0dfQ0FDSEVfQUREKEVtYmVkZGVkIHBlcmwgc3VwcG9ydDogICAgICBkaXNhYmxlZCkKICBBQ19NU0dfUkVTVUxUKFtkaXNhYmxlZF0pCmVsc2UKICBBQ19NU0dfQ0FDSEVfQUREKEVtYmVkZGVkIHBlcmwgc3VwcG9ydDogICAgICBlbmFibGVkKQogIEFDX01TR19SRVNVTFQoW2VuYWJsZWRdKQpmaQoKIyBpbnN0YWxsIHBlcmwgbW9kdWxlIHJlc3VsdHMKUEVSTFRBUkdTPSIiClBFUkxJTlNUQUxMVEFSR1M9IiIKUEVSTFVOSU5TVEFMTFRBUkdTPSIiCkFDX01TR19DSEVDS0lORyhbSWYgd2UgY2FuIGluc3RhbGwgdGhlIHBlcmwgbW9kdWxlc10pCmlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiA9ICJ4eWVzIiA7IHRoZW4KICAgIFBFUkxUQVJHUz0icGVybG1vZHVsZXMiCiAgICBQRVJMSU5TVEFMTFRBUkdTPSJwZXJsaW5zdGFsbCIKICAgIFBFUkxVTklOU1RBTExUQVJHUz0icGVybHVuaW5zdGFsbCIKICAgIGlmIHRlc3QgIngkZW1iZWRfcGVybCIgPSAieHllcyIgOyB0aGVuCiAgICAgIEFDX01TR19DQUNIRV9BREQoU05NUCBQZXJsIG1vZHVsZXM6ICAgICAgICAgIGJ1aWxkaW5nIC0tIGVtYmVkZGFibGUpCiAgICAgIEFDX01TR19SRVNVTFQoW3llcyAtLSBhbmQgZW1iZWRkYWJsZV0pCiAgICBlbHNlCiAgICAgIEFDX01TR19DQUNIRV9BREQoU05NUCBQZXJsIG1vZHVsZXM6ICAgICAgICAgIGJ1aWxkaW5nIC0tIG5vdCBlbWJlZGRhYmxlKQogICAgICBBQ19NU0dfUkVTVUxUKFt5ZXMgLS0gbm90IGVtYmVkZGFibGVdKQogICAgZmkKZWxzZQogICAgQUNfTVNHX1JFU1VMVChbbm9dKQogICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFBlcmwgbW9kdWxlczogICAgICAgICAgZGlzYWJsZWQpCmZpCkFDX1NVQlNUKFBFUkxUQVJHUykKQUNfU1VCU1QoUEVSTElOU1RBTExUQVJHUykKQUNfU1VCU1QoUEVSTFVOSU5TVEFMTFRBUkdTKQpBQ19TVUJTVChQRVJMQVJHUykKCgoKIyByZXNldCBsaWJzCkFHRU5UTElCUz0kTElCUwpMSUJTPSROT05BR0VOVExJQlMKCgoKIyBweXRob24gc3VwcG9ydApQWVRIT05UQVJHUz0iIgpQWVRIT05JTlNUQUxMVEFSR1M9IiIKUFlUSE9OVU5JTlNUQUxMVEFSR1M9IiIKUFlUSE9OQ0xFQU5UQVJHUz0iIgpBQ19NU0dfQ0hFQ0tJTkcoW0lmIHdlIHNob3VsZCBpbnN0YWxsIHRoZSBweXRob24gYmluZGluZ3NdKQppZiB0ZXN0ICJ4JGluc3RhbGxfcHl0aG9uIiA9ICJ4eWVzIiA7IHRoZW4KICAgIFBZVEhPTlRBUkdTPSJweXRob25tb2R1bGVzIgogICAgUFlUSE9OSU5TVEFMTFRBUkdTPSJweXRob25pbnN0YWxsIgogICAgUFlUSE9OVU5JTlNUQUxMVEFSR1M9InB5dGhvbnVuaW5zdGFsbCIKICAgIFBZVEhPTkNMRUFOVEFSR1M9InB5dGhvbmNsZWFuIgogICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFB5dGhvbiBtb2R1bGVzOiAgICAgICAgYnVpbGRpbmcpCiAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQplbHNlCiAgICBBQ19NU0dfQ0FDSEVfQUREKFNOTVAgUHl0aG9uIG1vZHVsZXM6ICAgICAgICBkaXNhYmxlZCkKICAgIEFDX01TR19SRVNVTFQoW25vXSkKZmkKQUNfU1VCU1QoUFlUSE9OVEFSR1MpCkFDX1NVQlNUKFBZVEhPTklOU1RBTExUQVJHUykKQUNfU1VCU1QoUFlUSE9OVU5JTlNUQUxMVEFSR1MpCkFDX1NVQlNUKFBZVEhPTkNMRUFOVEFSR1MpCkFDX1NVQlNUKFBZVEhPTkFSR1MpCgoKCiMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCkFDX0hFQURFUl9TVERDCkFDX0hFQURFUl9ESVJFTlQKQUNfSEVBREVSX1NZU19XQUlUCkFDX0NIRUNLX0hFQURFUlMoc3RkYXJnLmggc3RyaW5nLmggZmNudGwuaCBsaW1pdHMuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5c2xvZy5oIHVuaXN0ZC5oIHN5cy9kbWFwLmggbWFjaGluZS9wdGUuaCB4dGkuaCBzeXMvc29ja2lvLmggc3lzL3NvY2tldC5oIHN5cy9wYXJhbS5oKQojIGF0IGxlYXN0IFNvbGFyaXMgOSBuZWVkcyBzeXMvc29ja2V0LmggdG8gY29tcGlsZSBzeXMvc29ja2V0dmFyLmgKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc29ja2V0dmFyLmgsLCwKQUNfSU5DTFVERVNfREVGQVVMVChbXSkKWwojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCl0pCiMgYXQgbGVhc3QgT3BlbkJTRCAzLjQgbmVlZHMgc3lzL3BhcmFtLmggKE1BWFBBVEhMRU4pIHRvIGNvbXBpbGUgc3lzL3N3YXAuaApBQ19DSEVDS19IRUFERVJTKHN5cy9zd2FwLmgsLCwKQUNfSU5DTFVERVNfREVGQVVMVChbXSkKWwojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgpdKQpBQ19DSEVDS19IRUFERVJTKHN5cy90aW1lb3V0Lmggc3lzL3VuLmggZnN0YWIuaCBzeXMvZnMuaCBtdGFiLmggdWZzL2ZzLmggc3lzL2ZpeHBvaW50LmggbWFjaGluZS9wYXJhbS5oIHN5cy92bS5oIHZtL3ZtLmggc3lzL3ZtbWV0ZXIuaCBzeXMvdm1wYXJhbS5oIHN5cy92bW1hYy5oIHN5cy92bXN5c3RtLmggc3lzL3RpbWUuaCBzeXMvdGltZXMuaCBzeXMvc3RhdHZmcy5oIHN5cy92ZnMuaCBzeXMvbW50dGFiLmggc3lzL3NlbGVjdC5oIG1udGVudC5oIHN5cy9tbnRlbnQuaCBrc3RhdC5oIHV0c25hbWUuaCBzeXMvdXRzbmFtZS5oIHN5cy9jZGVmcy5oIGdldG9wdC5oIGxvY2FsZS5oIHB0aHJlYWQuaCBzeXMvbG9hZGF2Zy5oIHJlZ2V4LmggbGludXgvdGFza3MuaCBwd2QuaCBncnAuaCB1dG1weC5oKQojIE5ldHdvcmsgaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKGFycGEvaW5ldC5oIG5ldGluZXQvaW5fc3lzdG0uaCBuZXRpbmV0L2luLmggbmV0aW5ldC9pcF92YXIuaCBuZXRpbmV0L3RjcC5oIG5ldGluZXQvdGNwaXAuaCBuZXRpbmV0L3VkcC5oIG5ldC9pZi5oIG5ldGluZXQvaW5fdmFyLmggbmV0aW5ldC9pcC5oIG5ldGluZXQvaXBfaWNtcC5oIG5ldC9pZl9hcnAuaCBuZXQvaWZfbWliLmggbmV0L2lmX3Zhci5oIG5ldGluZXQvaWZfZXRoZXIuaCBuZXRpbmV0L3RjcF90aW1lci5oIG5ldGluZXQvdGNwX3Zhci5oIG5ldGluZXQvdWRwX3Zhci5oIG5ldGluZXQvaWNtcF92YXIuaCBuZXRkYi5oIG5ldC9yb3V0ZS5oLCwsCltbCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19USU1FT1VUX0gKI2luY2x1ZGUgPHN5cy90aW1lb3V0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRWQVJfSAojaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgojZW5kaWYKI2lmIEhBVkVfQVJQQV9JTkVUX0gKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9TWVNUTV9ICiNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3RtLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfSAojaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfSUNNUF9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX2ljbXAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVENQX0gKI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9UQ1BfVElNRVJfSAojaW5jbHVkZSA8bmV0aW5ldC90Y3BfdGltZXIuaD4KI2VuZGlmCl1dKQojIFVGUyBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlModWZzL3Vmcy9kaW5vZGUuaCB1ZnMvdWZzL3F1b3RhLmggdWZzL3Vmcy9pbm9kZS5oIHVmcy9mZnMvZnMuaCwsLApbWwojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWYgSEFWRV9VRlNfVUZTX0RJTk9ERV9ICiNpbmNsdWRlIDx1ZnMvdWZzL2Rpbm9kZS5oPgojZW5kaWYKI2lmIEhBVkVfVUZTX1VGU19RVU9UQV9ICiNpbmNsdWRlIDx1ZnMvdWZzL3F1b3RhLmg+CiNlbmRpZgpdXSkKIyBGcmVlQlNEIHJlcXVpcmVkIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhtYWxsb2MuaCBuZXQvaWZfZGwuaCBzeXMvc3lzY3RsLmggc3RkbGliLmggbmV0L2lmX3R5cGVzLmggc3lzL3F1ZXVlLmggb3NyZWxkYXRlLmggbWFjaGluZS90eXBlcy5oIHN5cy91c2VyLmggc3lzL3Byb2MuaCBzeXMvbWJ1Zi5oIHN5cy9tb3VudC5oLCwsCltbCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCl1dKQojIExpbnV4CkFDX0NIRUNLX0hFQURFUlMoc3lzL2NvbmYuaCBuZXRpbmV0L3RjcF9mc20uaCBzeXMvcHJvdG9zdy5oIG5saXN0LmggaW9jdGxzLmggYXNtL3BhZ2UuaCBhc20vdHlwZXMuaCBuZXRpcHgvaXB4LmggcGNpL3BjaS5oKQojIFNvbGFyaXMKQUNfQ0hFQ0tfSEVBREVSUyhpbmV0L21pYjIuaCkKIyBOZXRCU0QgcmVxdWlyZWQgaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKGt2bS5oIHN5cy9wb29sLmggdXZtL3V2bV9wYXJhbS5oIHV2bS91dm1fZXh0ZXJuLmggdm0vdm1fcGFyYW0uaCB2bS92bV9leHRlcm4uaCkKIyBCU0RpMiBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlModm0vc3dhcF9wYWdlci5oLCwsCltbCiNpZiBIQVZFX1ZNX1ZNX0gKI2luY2x1ZGUgPHZtL3ZtLmg+CiNlbmRpZgpdXSkKIyBsaW51eCBldGh0b29sCiMgcmVxdWlyZXMgc3BlY2lhbCBoYWNrcyB0byBnZXQgYXJvdW5kIHZhcmlvdXMgcHJvYmxlbXMgb24gb2xkZXIgbGludXgga2VybmVscy4KIyBtYWpvciB1Z2guLi4uCkFDX0NIRUNLX0hFQURFUlMobGludXgvZXRodG9vbC5oLCwsCltbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OyAgICAgICAgIC8qIGhhY2ssIHNvIHdlIG1heSBpbmNsdWRlIGtlcm5lbCdzIGV0aHRvb2wuaCAqLwp0eXBlZGVmIF9fdWludDMyX3QgdTMyOyAgICAgICAgIC8qIGRpdHRvICovCnR5cGVkZWYgX191aW50MTZfdCB1MTY7ICAgICAgICAgLyogZGl0dG8gKi8KdHlwZWRlZiBfX3VpbnQ4X3QgdTg7ICAgICAgICAgICAvKiBkaXR0byAqLwpdXSkKIyBCU0RpMyBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlMoc3lzL3N0YXQuaCkKIyBCU0RpMy9JUklYIGhlYWRlcnMKIyBhdCBsZWFzdCBJUklYIDYuNSBuZWVkcyBfS01FTVVTRVIgYW5kIHN5cy90eXBlcy5oIChtcHJvdF90KSB0byBjb21waWxlIAojICAgc3lzL3Zub2RlLmgKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdm5vZGUuaCwsLApbCiNkZWZpbmUgX0tNRU1VU0VSIDEKI2lmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKXSkKIyBhdCBsZWFzdCBJUklYIDYuNSBuZWVkcyBzeXMvc2VtYS5oIChtcmxvY2tfdCkgdG8gY29tcGlsZSBzeXMvaGFzaGluZy5oCkFDX0NIRUNLX0hFQURFUlMoc3lzL3NlbWEuaCkKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvaGFzaGluZy5oLCwsCkFDX0lOQ0xVREVTX0RFRkFVTFQoW10pClsKI2lmIEhBVkVfU1lTX1NFTUFfSAojaW5jbHVkZSA8c3lzL3NlbWEuaD4KI2VuZGlmCl0pCiMgbW9yZSBJUklYIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGNwaXBzdGF0cy5oIHN5cy9zeXNtcC5oIHN5cy9zeXN0ZW1pbmZvLmggc3lzL3N5c2dldC5oKQojIEFJWCBzeXN0ZW0gY29uZmlndXJhdGlvbgpBQ19DSEVDS19IRUFERVJTKHN5cy9zeXN0ZW1jZmcuaCkKIyBmcm9tIHNtdXggc3R1ZmYKQUNfQ0hFQ0tfSEVBREVSUyhlcnIuaCBzeXMvZmlsaW8uaCBzZ3R0eS5oKQojIEFJWCBuZWVkcyB0aGlzIGZvciBzdGF0ZnMgZnVuYwpBQ19DSEVDS19IRUFERVJTKHN5cy9zdGF0ZnMuaCkKIyBmb3IgSG9zdFJlcyAoSFAtVVggYXQgbGVhc3QpCkFDX0NIRUNLX0hFQURFUlMoc3lzL2RraW8uaCBzeXMvZGlza2lvLmggc3lzL3BzdGF0LmggbGludXgvaGRyZWcuaCBwa2dsb2NzLmgpCiMgZm9yIEhvc3RSZXMgKFNvbGFyaXMgMi54IGF0IGxlYXN0KQpBQ19DSEVDS19IRUFERVJTKHBrZ2luZm8uaCwKICAgIEFDX0NIRUNLX0xJQihhZG0sIHBrZ2luZm8sIEFDX0RFRklORShIQVZFX1BLR0lORk8pCiAgICBMSUJTPSIke0xJQlN9IC1sYWRtIgogICAgQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWxhZG0iKSkKCmNhc2UgJHRhcmdldF9vcyBpbgogICAgYWl4KikgIyBBSVggcGVyZnN0YXQgbGlicmFyeSwgbmVlZGVkIGZvciBDUFUvbWVtb3J5IHN0YXRpc3RpY3MKICAgICAgICBBQ19DSEVDS19IRUFERVJTKGxpYnBlcmZzdGF0LmgsCiAgICAgICAgICAgIEFDX0NIRUNLX0xJQihwZXJmc3RhdCwgcGVyZnN0YXRfY3B1X3RvdGFsLCBBQ19ERUZJTkUoSEFWRV9QRVJGU1RBVCkKICAgICAgICAgICAgQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWxwZXJmc3RhdCIpLCBBQ19NU0dfRVJST1IoWwoKKioqIFRvIG1vbml0b3IgQ1BVL21lbW9yeSB2YWx1ZXMgaW4gQUlYIHlvdSBuZWVkIHRvIGluc3RhbGwKKioqIGxpYnBlcmZzdGF0IHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBib3MucGVyZgpdKSkKICAgICAgICA7OwogICAgaHB1eCopICMgSFAtVVggYWdlbnQgbmVlZHMgb3Blbl9taWIKICAgICAgICBBQ19DSEVDS19MSUIobm0sIG9wZW5fbWliLCBBQ19ERUZJTkUoSEFWRV9MSUJOTSkKICAgICAgICAgICAgQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWxubSIpCiAgICAgICAgOzsKICAgICopCiAgICAgICAgOzsKZXNhYwojIFdJTjMyCiMgKG1pbmd3MzIgbXVzdCBsaW5rIHdpbnNvY2sgZXhwbGljaXRseSkKQUNfQ0hFQ0tfSEVBREVSUyh3aW5zb2NrLmgsWwogICAgICAgIEFHRU5UTElCUz0iJHtBR0VOVExJQlN9IC1saXBobHBhcGkiCiAgICAgICAgY2FzZSAkdGFyZ2V0X29zIGluCiAgICAgICAgICAgICAgICBtaW5ndyopCiAgICAgICAgICAgICAgICAgICAgICAgIExJQlM9IiR7TElCU30gLWxyZWdleCAtbHdzMl8zMiIKICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWxyZWdleCAtbHdzMl8zMiIKICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICopCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgZXNhYwpdKQpBQ19DSEVDS19IRUFERVJTKGlvLmgpCiMgU0NPCkFDX0NIRUNLX0hFQURFUlMoc3lzL3N0cmVhbS5oKQojIEtBTUUKQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2lwNi5oIG5ldGluZXQ2L2luNl92YXIuaCBuZXRpbmV0Ni9pbjZfcGNiLmggbmV0aW5ldDYvaXA2X3Zhci5oIG5ldGluZXQ2L3RjcDYuaCBuZXRpbmV0Ni90Y3A2X2ZzbS5oIG5ldGluZXQ2L25kNi5oIG5ldGluZXQ2L3RjcDZfdGltZXIuaCBuZXRpbmV0Ni90Y3A2X3Zhci5oLCwsCltbCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19RVUVVRV9ICiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUDZfSAojaW5jbHVkZSA8bmV0aW5ldC9pcDYuaD4KI2VuZGlmCl1dKQojIERZTkFNSUMgTU9EVUxFIFNVUFBPUlQKQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKQojIHRhYmxlX2FycmF5IGhlbHBlciBzdXBwb3J0CkFDX0NIRUNLX0hFQURFUlMoc2VhcmNoLmgpCgojIFJQTSBzdWJkaXJlY3RvcnkgcGF0aCAoc2lnaCkKaWYgdGVzdCAieCR3aXRoX3JwbSIgIT0gInhubyIgJiYgXAogICAgICAgIGVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiBob3N0L2hyX3N3aW5zdCAiID4gL2Rldi9udWxsOyB0aGVuCiAgQUNfQ0hFQ0tfSEVBREVSUyhycG0vcnBtZGIuaCkKZmkKCiMgT3BlbkJTRCAyLjYgbmVlZHMgbmV0aW5ldC9pbi5oIGJlZm9yZSBuZXRpbmV0L2luX3BjYi5oCkFDX01TR19DSEVDS0lORyhbW2ZvciBuZXRpbmV0L2luX3BjYi5oXV0pCkFDX0NBQ0hFX1ZBTChjdl9oYXZlX25ldGluZXRfaW5fcGNiX2gsClsgQUNfVFJZX0NQUCggWwojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4KXSwgY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oPXllcywgY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oPW5vKV0pCkFDX01TR19SRVNVTFQoJGN2X2hhdmVfbmV0aW5ldF9pbl9wY2JfaCkKaWYgdGVzdCAkY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfTkVUSU5FVF9JTl9QQ0JfSCkKZmkKCiMgTmV0QlNEIG5lZWRzIG1hY2hpbmUvdHlwZXMuaCBiZWZvcmUgc3lzL2Rpc2tsYWJlbC5oCkFDX01TR19DSEVDS0lORyhbW2ZvciBzeXMvZGlza2xhYmVsLmhdXSkKQUNfQ0FDSEVfVkFMKGN2X2hhdmVfc3lzX2Rpc2tsYWJlbF9oLApbIEFDX1RSWV9DUFAoIFsKI2luY2x1ZGUgPG1hY2hpbmUvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9kaXNrbGFiZWwuaD4KXSwgY3ZfaGF2ZV9zeXNfZGlza2xhYmVsX2g9eWVzLCBjdl9oYXZlX3N5c19kaXNrbGFiZWxfaD1ubyldKQpBQ19NU0dfUkVTVUxUKCRjdl9oYXZlX3N5c19kaXNrbGFiZWxfaCkKaWYgdGVzdCAkY3ZfaGF2ZV9zeXNfZGlza2xhYmVsX2ggPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TWVNfRElTS0xBQkVMX0gpCmZpCgojIE9wZW5TU0wKQUNfQ0hFQ0tfSEVBREVSUyhvcGVuc3NsL2htYWMuaCBvcGVuc3NsL2V2cC5oIG9wZW5zc2wvYWVzLmggb3BlbnNzbC9kZXMuaCBvcGVuc3NsL2RoLmgpCkFDX0NIRUNLX0hFQURFUlMoc2VjdXJpdHkvY3J5cHRva2kuaCkKCiMgUHJpbnRpbmcKQUNfUEFUSF9QUk9HKFtMUFNUQVRfUEFUSF0sbHBzdGF0KQppZiB0ZXN0IHgkTFBTVEFUX1BBVEggIT0geDsgdGhlbgogICAgQUNfREVGSU5FX1VOUVVPVEVEKExQU1RBVF9QQVRILCIkTFBTVEFUX1BBVEgiKQogICAgQUNfREVGSU5FKEhBVkVfTFBTVEFUKQpmaQpBQ19DSEVDS19GVU5DUyhjZ2V0bmV4dCkKaWYgdGVzdCAtciAvZXRjL3ByaW50Y2FwOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9QUklOVENBUCkKZmkKCkFDX01TR19DSEVDS0lORyhbZm9yIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnRdKQp1c2VvcGVuc3NsPW5vCnVzZXBrY3M9bm8KaWYgdGVzdCAieCRhY19jdl9saWJfcGtjczExX0NfSW5pdGlhbGl6ZSIgIT0gInh5ZXMiIC1vICJ4JGFjX2N2X2hlYWRlcl9zZWN1cml0eV9jcnlwdG9raV9oIiAhPSAieHllcyI7IHRoZW4KICAgIGlmIHRlc3QgIngkYXNrZWRwa2NzIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgQUNfTVNHX0VSUk9SKEFza2VkIHRvIHVzZSBQS0NTMTEgYnV0IEkgY291bGRuJ3QgZmluZCBpdC4pCiAgICBmaQplbHNlCiAgICBpZiB0ZXN0ICJ4JGFza2VkcGtjcyIgPSAieHllcyI7IHRoZW4KICAgICAgICB1c2Vwa2NzPXllcwogICAgZmkKZmkKCmlmIHRlc3QgIngkYWNfY3ZfbGliX2NyeXB0b19FVlBfbWQ1IiAhPSAieHllcyIgLW8gIngkYWNfY3ZfaGVhZGVyX29wZW5zc2xfaG1hY19oIiAhPSAieHllcyIgLW8gIngkYWNfY3ZfaGVhZGVyX29wZW5zc2xfaG1hY19oIiAhPSAieHllcyI7IHRoZW4KICAgIGlmIHRlc3QgIngkYXNrZWRvcGVuc3NsIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgIEFDX01TR19FUlJPUihBc2tlZCB0byB1c2UgT3BlblNTTCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0LikKICAgIGZpCmVsc2UKICAgIGlmIHRlc3QgIngkYXNrZWRvcGVuc3NsIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgIHVzZW9wZW5zc2w9eWVzCiAgICBlbGlmIHRlc3QgIngkdHJ5b3BlbnNzbCIgPSAieHllcyI7IHRoZW4KICAgICAgICBpZiB0ZXN0ICJ4JHVzZXBrY3MiICE9ICJ4eWVzIjsgdGhlbgogICAgICAgICAgICB1c2VvcGVuc3NsPXllcwogICAgICAgIGZpCiAgICBmaQpmaQoKaWYgdGVzdCAieCR1c2VvcGVuc3NsIiAhPSAieG5vIiA7IHRoZW4KICAgIGF1dGhtb2Rlcz0iTUQ1IFNIQTEiCiAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9wcml2YWN5IiAhPSAieG5vIiA7IHRoZW4KICAgICAgICBpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9vcGVuc3NsX2Flc19oIiA9ICJ4eWVzIiA7IHRoZW4KICAgICAgICAgICAgZW5jcm1vZGVzPSJERVMgQUVTIgoJZWxzZQoJICAgIGVuY3Jtb2Rlcz0iREVTIgoJZmkKICAgIGVsc2UKICAgICAgICBlbmNybW9kZXM9IltkaXNhYmxlZF0iCiAgICBmaQogICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX09QRU5TU0wpCiAgICBMSUJDUllQVE89Ii1sY3J5cHRvIgogICAgQUNfTVNHX1JFU1VMVChPcGVuU1NMIFN1cHBvcnQpCmVsaWYgdGVzdCAieCR1c2Vwa2NzIiAhPSAieG5vIiA7IHRoZW4KICAgIGF1dGhtb2Rlcz0iTUQ1IFNIQTEiCiAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9wcml2YWN5IiAhPSAieG5vIiA7IHRoZW4KICAgICAgICBlbmNybW9kZXM9IkRFUyIKICAgIGVsc2UKICAgICAgICBlbmNybW9kZXM9IltkaXNhYmxlZF0iCiAgICBmaQogICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX1BLQ1MxMSkKICAgIEFDX01TR19SRVNVTFQoUEtDUzExIFN1cHBvcnQpCmVsaWYgdGVzdCAieCRlbmFibGVfbWQ1IiAhPSAieG5vIjsgdGhlbgogICAgYXV0aG1vZGVzPSJNRDUiCiAgICBlbmNybW9kZXM9IiIKICAgIEFDX0RFRklORShORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUpCiAgICBBQ19NU0dfUkVTVUxUKEludGVybmFsIE1ENSBTdXBwb3J0KQpmaQppZiB0ZXN0ICJ4JGVuYWJsZV9tZDUiID0gInhubyI7IHRoZW4KICAgIGF1dGhtb2Rlcz1gZWNobyAkYXV0aG1vZGVzIHwgc2VkICdzL01ENSAqLy87J2AKZmkKQUNfU1VCU1QoTElCQ1JZUFRPKQoKQUNfTVNHX0NBQ0hFX0FERChBdXRoZW50aWNhdGlvbiBzdXBwb3J0OiAgICAgJGF1dGhtb2RlcykKQUNfTVNHX0NBQ0hFX0FERChFbmNyeXB0aW9uIHN1cHBvcnQ6ICAgICAgICAgJGVuY3Jtb2RlcykKCmlmIHRlc3QgIngkYWxsX3dhcm5pbmdzIiAhPSAieCI7IHRoZW4KICAgIEFDX01TR19DQUNIRV9BREQoV0FSTklORzogJGFsbF93YXJuaW5ncykKZmkKCiMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KQUNfVFlQRV9PRkZfVApBQ19UWVBFX1BJRF9UCkFDX0hFQURFUl9USU1FCgojIHRoaXMgc2hvdWxkIHVzZSBBQ19DSEVDS19UWVBFLCBidXQgaXQncyBicm9rZW4gYXQgbGVhc3QgaW4gMi4xMy0xNAojIHNvIHdlIGRvIGl0IGJ5IGhhbmQuCkFDX01TR19DSEVDS0lORyhbZm9yIHNvY2tsZW5fdF0pCkFDX0NBQ0hFX1ZBTChhY19jdl90eXBlXyQxLApbQUNfRUdSRVBfQ1BQKFtzb2NrbGVuX3RAPDpAXmEtekEtWl8wLTlAOj5AXSwKWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFNURENfSEVBREVSUwojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWZdLCBbYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9eWVzXSwgW2FjX2N2X3R5cGVfc29ja2xlbl90PW5vXSldKQoKQUNfTVNHX1JFU1VMVChbJGFjX2N2X3R5cGVfc29ja2xlbl90XSkKaWYgdGVzdCAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TT0NLTEVOX1QpCmZpCgojIEFJWCBrZWVwcyBpbl9hZGRyX3QgaW4gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbl9hZGRyX3RdKQpBQ19DQUNIRV9WQUwoYWNfY3ZfdHlwZV8kMSwKW0FDX0VHUkVQX0NQUChbaW5fYWRkcl90QDw6QF5hLXpBLVpfMC05QDo+QF0sClsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBTVERDX0hFQURFUlMKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmXSwgW2FjX2N2X3R5cGVfaW5fYWRkcl90PXllc10sIFthY19jdl90eXBlX2luX2FkZHJfdD1ub10pXSkKCkFDX01TR19SRVNVTFQoWyRhY19jdl90eXBlX2luX2FkZHJfdF0pCmlmIHRlc3QgJGFjX2N2X3R5cGVfaW5fYWRkcl90ID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfSU5fQUREUl9UKQpmaQoKIyBPbGRlciB2ZXJzaW9ucyBvZiBNaW5HVyBkbyBub3QgZGVmaW5lIHNzaXplX3QgaW4gc3lzL3R5cGVzCkFDX01TR19DSEVDS0lORyhbZm9yIHNzaXplX3RdKQpBQ19DQUNIRV9WQUwoYWNfY3ZfdHlwZV8kMSwKW0FDX0VHUkVQX0NQUChbc3NpemVfdEA8OkBeYS16QS1aXzAtOUA6PkBdLApbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgU1REQ19IRUFERVJTCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojZW5kaWZdLCBbYWNfY3ZfdHlwZV9zc2l6ZV90PXllc10sIFthY19jdl90eXBlX3NzaXplX3Q9bm9dKV0pCgpBQ19NU0dfUkVTVUxUKFskYWNfY3ZfdHlwZV9zc2l6ZV90XSkKaWYgdGVzdCAkYWNfY3ZfdHlwZV9zc2l6ZV90ID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfU1NJWkVfVCkKZmkKCiMgQ2hlY2sgcHMgYXJncwpBQ19DQUNIRV9DSEVDSyhbZm9yIGNvcnJlY3QgZmxhZ3MgdG8gcHNdLCBhY19jdl9wc19mbGFncywKW2lmIHRlc3QgImAoJFBTUFJPRyAtZSAyPiYxKSB8ICRFR1JFUCAnIChwcykgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1lIgplbGlmIHRlc3QgImAoJFBTUFJPRyAtZWwgMj4mMSkgfCAkRUdSRVAgJyAocHMpICokJyB8IGF3ayAne3ByaW50ICRORn0nYCIgPSAicHMiIDsgdGhlbgogIGFjX2N2X3BzX2ZsYWdzPSItZWwiCmVsaWYgdGVzdCAiYCgkUFNQUk9HIGFjeCAyPiYxKSB8ICRFR1JFUCAnIChwcykgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9ImFjeCIKZWxpZiB0ZXN0ICJgKCRQU1BST0cgLWFjeCAyPiYxKSB8ICRFR1JFUCAnIChwcykgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1hY3giCmVsaWYgdGVzdCAiYCgkUFNQUk9HIC1vIHBpZCx0dCxzdGF0ZSx0aW1lLHVjb21tIDI+JjEpIHwgJEVHUkVQICcgcHMgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1vIHBpZCx0dCxzdGF0ZSx0aW1lLHVjb21tIgplbGlmIHRlc3QgImAoJFBTUFJPRyBheCAyPiYxKSB8ICRFR1JFUCAnIChwcykgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9ImF4IgplbGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4Y3lnd2luIjsgdGhlbgogIGFjX2N2X3BzX2ZsYWdzPSItZSIKZWxpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbiAKICBhY19jdl9wc19mbGFncz0iLWUiCmVsc2UKICBBQ19NU0dfV0FSTihbVW5hYmxlIHRvIGRldGVybWluZSB2YWxpZCBwcyBmbGFncy4uLiAgZGVmYXVsdGluZy4uLl0pCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1hY3giCmZpCl0pCgpQU0NNRD0iJFBTUFJPRyAkYWNfY3ZfcHNfZmxhZ3MiCkFDX1NVQlNUKFBTQ01EKQpBQ19ERUZJTkVfVU5RVU9URUQoUFNDTUQsICIkUFNQUk9HICRhY19jdl9wc19mbGFncyIpCgojIENoZWNrcyBmb3IgYnl0ZSBvcmRlcgppZiB0ZXN0ICRjcm9zc19jb21waWxpbmcgPSB5ZXM7IHRoZW4KICBpZiB0ZXN0ICR3aXRoX2VuZGlhbm5lc3MgPSAiYmlnIjsgdGhlbgogICAgQUNfREVGSU5FKFdPUkRTX0JJR0VORElBTikKICBlbGlmIHRlc3QgLXogJHdpdGhfZW5kaWFubmVzczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtZb3UgYXJlIGNyb3NzLWNvbXBpbGluZywgYnV0IHlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgdGhlIHRhcmdldCdzIGVuZGlhbm5lc3NdKQogIGZpCmVsc2UKICBpZiB0ZXN0ICR3aXRoX2VuZGlhbm5lc3M7IHRoZW4KICAgIEFDX01TR19FUlJPUihbRW5kaWFubmVzcyBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCB5b3UgYXJlIG5vdCBjcm9zcy1jb21waWxpbmcuXSkKICBmaQogIEFDX0NfQklHRU5ESUFOCmZpCgojIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCkFDX0ZVTkNfQUxMT0NBCkFDX1BST0dfR0NDX1RSQURJVElPTkFMCkFDX0ZVTkNfTUVNQ01QCkFDX1RZUEVfU0lHTkFMCkFDX0ZVTkNfR0VUTU5URU5UCkFDX0NIRUNLX0ZVTkNTKHNldG1udGVudCBnZXRob3N0bmFtZSB1bmFtZSBnZXR0aW1lb2ZkYXkgc2VsZWN0IHNvY2tldCBzdHJ0b2wgc3RydG91bCBzdHJsY3B5KQpBQ19DSEVDS19GVU5DUyhzdHJjaHIgc3RydG9rX3Igc3RyZHVwIG1lbWNweSBtZW1tb3ZlIGluZGV4IGJjb3B5IHN0cmNhc2VzdHIgcmVnY29tcCkKQUNfQ0hFQ0tfRlVOQ1Moc2lnbmFsIHNldHNpZCBzaWdzZXQgc2lnYmxvY2sgc2lnaG9sZCBzdHJlcnJvciBzZXRlbnYgdnNucHJpbnRmIHNucHJpbnRmKQpBQ19DSEVDS19GVU5DUyhzaWdhY3Rpb24pCkFDX0NIRUNLX0ZVTkNTKHJhbmRvbSBscmFuZDQ4IHJhbmQpCkFDX0NIRUNLX0ZVTkNTKGV4ZWN2IHN5c3RlbSBmb3JrIGdldHBpZCBzdHJuY2FzZWNtcCBzaWdhbHJtKQpBQ19DSEVDS19GVU5DUyhsc2VlazY0KQppZiB0ZXN0ICJ4JHdpdGhfcnBtIiAhPSAieG5vIiAmJiBcCiAgICAgICAgZWNobyAiICRtb2R1bGVfbGlzdCAiIHwgZ3JlcCAiIGhvc3QvaHJfc3dpbnN0ICIgPiAvZGV2L251bGw7IHRoZW4KICBPTERMSUJTPSRMSUJTCiAgTElCUz0kQUdFTlRMSUJTCiAgQUNfQ0hFQ0tfRlVOQ1MocnBtR2V0UGF0aCkKICBMSUJTPSRPTERMSUJTCmZpCgpBQ19DSEVDS19GVU5DUyhnZXRsb2FkYXZnKQpBQ19DSEVDS19GVU5DUyhnZXRhZGRyaW5mbyBnZXRpcG5vZGVieW5hbWUpCiMgQlNEaTIgZnVuY3Rpb25zIGRpZmZlcgpBQ19DSEVDS19GVU5DUyhzdGF0dmZzIHN0YXRmcykKQUNfQ0hFQ0tfRlVOQ1MoZ2V0ZHRhYmxlc2l6ZSkKIyBmcmVlYnNkMiBjaGVja3MKQUNfQ0hFQ0tfRlVOQ1MoZ2V0ZnNzdGF0KQpBQ19DSEVDS19GVU5DUyh1c2xlZXApCkFDX0NIRUNLX0ZVTkNTKHNldGxvY2FsZSkKQUNfQ0hFQ0tfRlVOQ1ModGNnZXRhdHRyKQpBQ19DSEVDS19GVU5DUyhpZl9uYW1laW5kZXggaWZfZnJlZW5hbWVpbmRleCkKIyBzb2xhcmlzIGNoZWNrcwpBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSkKQUNfQ0hFQ0tfRlVOQ1MobWtzdGVtcCkKQUNfQ0hFQ0tfRlVOQ1MoZ2V0cHduYW0gZ2V0Z3JuYW0gc2V0Z2lkIHNldHVpZCBzZXRncm91cHMpCiMgSGlnaCByZXNvbHV0aW9uIGFsYXJtIHN1cHBvcnQKQUNfQ0hFQ0tfRlVOQ1Moc2V0aXRpbWVyKQojIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRoZSBjbG9jay4KQUNfQ0hFQ0tfRlVOQ1MobWt0aW1lIHN0aW1lIHRpbWVzIHN5c2NvbmYpCiMgbWlzc2luZyBmcm9tIGhwLXV4CkFDX0NIRUNLX0ZVTkNTKGlmX25hbWV0b2luZGV4KQoKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIFNJT0NHSUZBRERSIGluIHN5cy9pb2N0bC5oXV0pCkFDX0NBQ0hFX1ZBTChjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFIsClsgQUNfRUdSRVBfQ1BQKHh4eHllc3h4eCwKWwojaWZkZWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgU0lPQ0dJRkFERFIKeHh4eWVzeHh4CiNlbmRpZgpdLCBjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFI9eWVzLCBjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFI9bm8pXSkKQUNfTVNHX1JFU1VMVCgkY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSKQppZiB0ZXN0ICRjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1lTX0lPQ1RMX0hfSEFTX1NJT0NHSUZBRERSKQpmaQoKIyB1bHRyaXgKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIHR3by1hcmd1bWVudCBzdGF0ZnMgd2l0aCBzdHJ1Y3QgZnNfZGF0YSAoVWx0cml4KV1dKQpBQ19DQUNIRV9WQUwoZnVfY3Zfc3lzX3N0YXRfZnNfZGF0YSwKW0FDX1RSWV9SVU4oWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvZnNfdHlwZXMuaD4KI2VuZGlmCm1haW4gKCkKewpzdHJ1Y3QgZnNfZGF0YSBmc2Q7Ci8qIFVsdHJpeCdzIHN0YXRmcyByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsCiAgIDAgZm9yIG5vdCBtb3VudGVkLCAtMSBmb3IgZmFpbHVyZS4gICovCmV4aXQgKHN0YXRmcyAoIi4iLCAmZnNkKSAhPSAxKTsKfV0sCmZ1X2N2X3N5c19zdGF0X2ZzX2RhdGE9eWVzLApmdV9jdl9zeXNfc3RhdF9mc19kYXRhPW5vLApmdV9jdl9zeXNfc3RhdF9mc19kYXRhPW5vKV0pCkFDX01TR19SRVNVTFQoJGZ1X2N2X3N5c19zdGF0X2ZzX2RhdGEpCmlmIHRlc3QgJGZ1X2N2X3N5c19zdGF0X2ZzX2RhdGEgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1RBVF9TVEFURlNfRlNfREFUQSkKZmkKCiMgY2hlY2sgaWYgY29tcGlsZXIgcHJlLXByb2Nlc3NvciBkZWZpbmVzIF9fRlVOQ1RJT05fXwpBQ19DQUNIRV9DSEVDSyhpZiBfX0ZVTkNUSU9OX18gaXMgZGVmaW5lZCxhY19jdl9IQVZFX0NQUF9VTkRFUkJBUl9GVU5DVElPTl9ERUZJTkVELApbCkFDX1RSWV9DT01QSUxFKCxbCiAgICBjaGFyICpjcCA9IF9fRlVOQ1RJT05fXzsKXSwgYWNfY3ZfSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRD15ZXMsIGFjX2N2X0hBVkVfQ1BQX1VOREVSQkFSX0ZVTkNUSU9OX0RFRklORUQ9bm8pXSkKCmlmIHRlc3QgIngkYWNfY3ZfSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRCIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRCkKZmkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG9uIFNDTyBVbml4d2FyZSA3LjEuNCAoU0NPIGNvbXBpbGVyKSwgInN0YXRpYyBpbmxpbmUiIGZ1bmN0aW9ucwojIGFyZSBub3Qgc3VwcG9ydGVkLCBzbyB0aGlzIGRpc2FibGVzIHRoZSB3aG9sZSBpbmxpbmUgdGhpbmcgaWYgaXQKIyBkb2Vzbid0IHdvcmsgcHJvcGVybHkuIFNob3VsZCBoYXZlIG5vIGVmZmVjdCBvbiBvdGhlciBwbGF0Zm9ybXMuCkFDX01TR19DSEVDS0lORyhbd2hldGhlciBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyBhcmUgYnJva2VuIChVbml4d2FyZSldKQpBQ19UUllfQ09NUElMRSgsWwogIHN0YXRpYyBpbmxpbmUgaW50IG5lc3RlZF9pbmxpbmVfZnVuY3Rpb24odm9pZCkgewogICAgcmV0dXJuIDA7CiAgfQogIGlubGluZSBpbnQgbWFpbl9pbmxpbmVfZnVuY3Rpb24oIHZvaWQgKSB7CiAgICByZXR1cm4gbmVzdGVkX2lubGluZV9mdW5jdGlvbigpOwogIH0KXSxhY19jdl9CUk9LRU5fSU5MSU5FPW5vLCBhY19jdl9CUk9LRU5fSU5MSU5FPXllcykKCmlmIHRlc3QgIngkYWNfY3ZfQlJPS0VOX0lOTElORSIgPSB4InllcyIgOyB0aGVuCiAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgQUNfREVGSU5FKE5FVFNOTVBfQlJPS0VOX0lOTElORSkKZWxzZQogIEFDX01TR19SRVNVTFQobm8pCmZpCgojIG9wZW5ic2Qgc2VlbXMgdG8gaGF2ZSBkcm9wcGVkIG1fY2x1c3RlcnMgYW5kIG1fY2xmcmVlIGZyb20gbWJzdGF0CkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9TWVNfTUJVRl9ICiNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgojZW5kaWYKXSwgbWJzdGF0LCBtX2NsdXN0ZXJzLCBubykKCiMgb3BlbmJzZCBzZWVtcyB0byBoYXZlIGRyb3BwZWQgbV9tYnVmcyBmcm9tIG1ic3RhdCB0b28KQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX1NZU19NQlVGX0gKI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiNlbmRpZgpdLCBtYnN0YXQsIG1fbWJ1ZnMsIG5vKQoKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Cl0sIHNpZ2FjdGlvbiwgc2Ffc2lnYWN0aW9uLCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKXSwgdG0sIHRtX2dtdG9mZiwgbm8pCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZGVmaW5lIEtFUk5FTAojZGVmaW5lIF9LRVJORUwKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTApdLCBzb2NrYWRkciwgc2FfbGVuLCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCl0sIHNvY2thZGRyLCBzYV91bmlvbi5zYV9nZW5lcmljLnNhX2ZhbWlseTIsIG5vKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKXSwgc29ja2FkZHJfc3RvcmFnZSwgc3NfZmFtaWx5LCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCl0sIHNvY2thZGRyX3N0b3JhZ2UsIF9fc3NfZmFtaWx5LCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfZHN0LCBubykKCiMgY2hlY2tpbmcgZm9yIDQuMyB2cyA0LjQgcnRlbnRyeS4KQUNfQ0FDSEVfQ0hFQ0sodHlwZSBvZiBydGVudHJ5IHN0cnVjdHVyZSxhY19jdl9SVEVOVFJZX1RZUEUsClsKCiMgNC40IGNvbXBhdApBQ19UUllfQ09NUElMRShbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLFsKCiNpZm5kZWYgU1RSVUNUX1JURU5UUllfSEFTX1JUX0RTVAojZGVmaW5lIHJ0X2RzdCBydF9ub2Rlcy0+cm5fa2V5CiNlbmRpZgoKICBzdHJ1Y3QgcnRlbnRyeSBydDsgCiAgcnQucnRfbm9kZXNbMF0ucm5fZmxhZ3MgPSAxOwogIHJ0LnJ0X2RzdDsKICBdLCBhY19jdl9SVEVOVFJZX1RZUEU9IkJTRC00LjQiKQoKIyA0LjMgY29tcGF0CmlmIHRlc3QgIngkYWNfY3ZfUlRFTlRSWV9UWVBFIiA9ICJ4IjsgdGhlbgpBQ19UUllfQ09NUElMRShbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLFsKc3RydWN0IHJ0ZW50cnkgcnQ7IApydC5ydF9oYXNoOwpdLCBhY19jdl9SVEVOVFJZX1RZUEU9IkJTRC00LjMiKQpmaQoKIyBlbHNlIGFjay4KaWYgdGVzdCAieCRhY19jdl9SVEVOVFJZX1RZUEUiID0gIngiOyB0aGVuCiAgQUNfTVNHX1JFU1VMVChVbmtub3duKQogIGFjX2N2X1JURU5UUllfVFlQRT0idW5rbm93biIKZmkKCl0pCgppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieEJTRC00LjQiOyB0aGVuCiAgQUNfREVGSU5FKFJURU5UUllfNF80KQpmaQoKIyBjaGVja2luZyBmb3IgYWxwaGEncyBvcnRlbnRyeSB2cyBydGVudHJ5CmlmIHRlc3QgIngkYWNfY3ZfUlRFTlRSWV9UWVBFIiA9ICJ4dW5rbm93biI7IHRoZW4KQUNfQ0FDSEVfQ0hFQ0soZm9yIHN0cnVjdCBydGVudHJ5LCBhY19jdl9zdHJ1Y3RfcnRlbnRyeSwKW0FDX0VHUkVQX0NQUChvcnRlbnRyeSwgWyNkZWZpbmUgS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgIGFjX2N2X3N0cnVjdF9ydGVudHJ5PW9ydGVudHJ5LCAgYWNfY3Zfc3RydWN0X3J0ZW50cnk9cnRlbnRyeSApCmlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X3J0ZW50cnkiID0gInhydGVudHJ5IiA7IHRoZW4KICBhY19jdl9zdHJ1Y3RfcnRlbnRyeT0icnRlbnRyeSIKZWxzZQogIGFjX2N2X3N0cnVjdF9ydGVudHJ5PSJvcnRlbnRyeSIKZmkKXSkKZWxzZQogIFJURU5UUllfVFlQRT0icnRlbnRyeSIKICBhY19jdl9zdHJ1Y3RfcnRlbnRyeT0icnRlbnRyeSIKZmkKCmlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X3J0ZW50cnkiICE9ICJ4IjsgdGhlbgogIEFDX0RFRklORV9VTlFVT1RFRChSVEVOVFJZLHN0cnVjdCAke2FjX2N2X3N0cnVjdF9ydGVudHJ5fSkKZWxzZQogIEFDX0RFRklORShSVEVOVFJZLHN0cnVjdCBydGVudHJ5KQpmaQoKIyBjaGVjayBmb3IgNC4zJ3MgcnRlbnRyeS0+cnRfbmV4dAppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieEJTRC00LjMiOyB0aGVuCkFDX0NBQ0hFX0NIRUNLKGZvciBzdHJ1Y3QgcnRlbnRyeSBoYXMgYSBydF9uZXh0IG5vZGUsIAoJYWNfY3Zfc3RydWN0X3J0ZW50cnlfcnRfbmV4dCwKWwpBQ19UUllfQ09NUElMRShbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLFsKc3RydWN0IHJ0ZW50cnkgcnQ7IApydC5ydF9uZXh0OwpdLCBhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0PXllcywgIGFjX2N2X3N0cnVjdF9ydGVudHJ5X3J0X25leHQ9bm8gKQpdKQoKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0IiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShSVEVOVFJZX1JUX05FWFQpCmZpCgpmaQoKIyBDaGVjayBzdHJ1Y3QgcnRlbnRyeSBmb3IgdmFyaW91cyB0aGluZ3MuCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfdW5pdCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfcmVmY250KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLCBydGVudHJ5LCBydF9oYXNoKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLCBydGVudHJ5LCBydF91c2UpCgojIENoZWNrIHRjcHN0YXQgZm9yIHRjcHN0YXQudGNwX3Jjdm1lbWRyb3AKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVPVVRfSAojaW5jbHVkZSA8c3lzL3RpbWVvdXQuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaWZkZWYgSEFWRV9ORVRJTkVUX1RDUF9USU1FUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX05FVElORVRfVENQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KI2VuZGlmCl0sIHRjcHN0YXQsIHRjcF9yY3ZtZW1kcm9wKQoKIyBpcml4IGNoZWNrcwoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPG5ldC9pZi5oPgojaWZkZWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCl0sIGlmbmV0LCBpZl9tdHUpCgppZiB0ZXN0ICJ4JGFjX2N2X3N0cnVjdF9pZm5ldF9oYXNfaWZfbXR1IiA9ICJ4bm8iOyB0aGVuCkFDX0NBQ0hFX0NIRUNLKGlmIF9LRVJORUwgbmVlZHMgdG8gYmUgZGVmaW5lZCBmb3IgaWZfbXR1LCBhY19jdl9JRk5FVF9ORUVEU19LRVJORUwsClsKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfaWZuZXRfaGFzX2lmX210dSIgPSAieHllcyI7IHRoZW4KICBhY19jdl9JRk5FVF9ORUVEU19LRVJORUw9bm8KZWxzZQpBQ19UUllfQ09NUElMRShbCiNkZWZpbmUgX0tFUk5FTCAxCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmZGVmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgpdLFsKc3RydWN0IGlmbmV0IHRlc3RpdDsKdGVzdGl0LmlmX210dSA9IDA7Cl0sIGFjX2N2X0lGTkVUX05FRURTX0tFUk5FTD15ZXMsIGFjX2N2X0lGTkVUX05FRURTX0tFUk5FTD1ubykKZmkKXSkKCmlmIHRlc3QgIngkYWNfY3ZfSUZORVRfTkVFRFNfS0VSTkVMIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShJRk5FVF9ORUVEU19LRVJORUwpCmZpCmZpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaWZkZWYgSEFWRV9TWVNfVElNRV9ICiNpbmNsdWRlIDxzeXMvdGltZS5oPgojZW5kaWYKI2luY2x1ZGUgPG5ldC9pZi5oPgojaWZkZWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCl0sIGlmYWRkciwgaWZhX25leHQpCgojIENoZWNrIGlmbmV0IGVudHJpZXMgdXNpbmcgbWFjcm8gZGVmaW5lZCBpbiBhY2xvY2FsLm00LgojCiMgWFhYICBCcm9rZW4gb24gRnJlZUJTRCB3aGVyZSB0aGVzZSBhcmUgI2RlZmluZSdkIGluIDxuZXQvaWYuaD4KIwpBQ19DSEVDS19JRk5FVF9GT1IoaWZfYmF1ZHJhdGUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9iYXVkcmF0ZS5pZnNfdmFsdWUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9zcGVlZCkKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX3R5cGUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9pbWNhc3RzKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfaXFkcm9wcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX25vcHJvdG8pCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9vbWNhc3RzKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfeG5hbWUsbm8pCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9sYXN0Y2hhbmdlLnR2X3NlYykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX29ieXRlcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2lieXRlcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2FkZHJsaXN0KQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfYWRkcmhlYWQudHFoX2ZpcnN0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX2Rpc2NhcmQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwX3Zhci5oPgojZW5kaWYKXSx1ZHBzdGF0LHVkcHNfbm9wb3J0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX25vcG9ydGJjYXN0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX2Z1bGxzb2NrKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2VuZGlmCl0sYXJwaGQsYXRfbmV4dCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9TWVNfQ09ORl9ICiNpbmNsdWRlIDxzeXMvY29uZi5oPgojZW5kaWYKXSxzd2RldnQsc3dfbmJsa3NlbmFibGVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFUVkZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CiNlbmRpZgpdLHN0YXR2ZnMsbW50X2RpcikKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVFZGU19ICiNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgojZW5kaWYKXSxzdGF0dmZzLGZfZnJzaXplKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFUVkZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CiNlbmRpZgpdLHN0YXRmcyxmX2Zyc2l6ZSkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVFZGU19ICiNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgojZW5kaWYKXSxzdGF0dmZzLGZfZmlsZXMpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNlbmRpZgpdLHN0YXRmcyxmX2ZpbGVzKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojZW5kaWYKXSxzdGF0ZnMsZl9mZnJlZSkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2VuZGlmCl0sc3RhdGZzLGZfZmF2YWlsKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX05MSVNUX0gKI2luY2x1ZGUgPG5saXN0Lmg+CiNlbmRpZgpdLG5saXN0LG5fdmFsdWUpCgojIHN0cnVjdCBubGlzdDY0IChJUklYKQpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmIEhBVkVfTkxJU1RfSAojaW5jbHVkZSA8bmxpc3QuaD4KI2VuZGlmCl0sbmxpc3Q2NCwgbl92YWx1ZSkKCiMgY2hlY2sgc3RydWN0IGlwc3RhdCBmb3IgdmFyaW91cyB0aGluZ3MKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfY2FudGZvcndhcmQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19jYW50ZnJhZykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2RlbGl2ZXJlZCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2ZyYWdkcm9wcGVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfZnJhZ3RpbWVvdXQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19mcmFnbWVudGVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfbG9jYWxvdXQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19ub3Byb3RvKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfbm9yb3V0ZSkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX29kcm9wcGVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfb2ZyYWdtZW50cykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX3JlYXNzZW1ibGVkKQoKIyBjaGVjayBmb3IgdGhlIGRlc19rc19zdHJ1Y3Qud2Vha19rZXkgYXR0cmlidXRlLCB3aGljaCBpbmRpY2F0ZXMgdGhlIAojIG9sZGVyIG9wZW5zc2wgdmVyc2lvbiBpcyBiZWluZyB1c2VkLgppZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9vcGVuc3NsX2Rlc19oIiA9ICJ4eWVzIiA7IHRoZW4KQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgpdLCBkZXNfa3Nfc3RydWN0LCB3ZWFrX2tleSkKZmkKCiMgYXR0ZW1wdCB0byBmaWd1cmUgb3V0IGlmIHN5c2N0bCBpcyB1c2FibGUKCmlmIHRlc3QgJGNyb3NzX2NvbXBpbGluZyA9IHllczsgdGhlbgogIEFDX01TR19XQVJOKFtDYW4ndCBjaGVjayBzeXNjdGwsIG1hbnVhbGx5IGRlZmluZSBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMIGlmIHBsYXRmb3JtIHN1cHBvcnQgYXZhaWxhYmxlXSkKZWxzZQogIEFDX0NBQ0hFX0NIRUNLKGlmIHN5c2N0bCBjYW4gcmVhZCBrZXJuZWwgaW5mb3JtYXRpb24sYWNfY3ZfTkVUU05NUF9DQU5fVVNFX1NZU0NUTCwKICBbQUNfVFJZX1JVTihbCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1BBUkFNX0gKIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCm1haW4oKSB7CiAgaW50ICAgICAgICAgICAgICAgICBtaWJbMl07CiAgc2l6ZV90ICAgICAgICAgICAgICBsZW47CiAgc3RydWN0IHRpbWV2YWwgYm9vdHRpbWU7CiAgCiAgbWliWzBdID0gQ1RMX0tFUk47CiAgbWliWzFdID0gS0VSTl9CT09UVElNRTsKICAKICBsZW4gPSBzaXplb2YoYm9vdHRpbWUpOwogIHN5c2N0bChtaWIsIDIsICZib290dGltZSwgJmxlbiwgTlVMTCwgTlVMTCk7CiAgaWYgKGJvb3R0aW1lLnR2X3NlYyAhPSAwKQogICAgZXhpdCgwKTsKICBlbHNlCiAgICBleGl0KDEpOwp9CiAgXSwgYWNfY3ZfTkVUU05NUF9DQU5fVVNFX1NZU0NUTD15ZXMsIGFjX2N2X05FVFNOTVBfQ0FOX1VTRV9TWVNDVEw9bm8sIGFjX2N2X05FVFNOTVBfQ0FOX1VTRV9TWVNDVEw9bm8pXSkKZmkKCmlmIHRlc3QgIngkYWNfY3ZfTkVUU05NUF9DQU5fVVNFX1NZU0NUTCIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkKZmkKCiMKIyBJbiBGcmVlQlNEIDQueCwgdGhlIFRDUCB0aW1lciBjb25zdGFudHMgYXJlbid0LiAgVGhleSBhcmUgZGVmaW5lZAojIGluIHRlcm1zIG9mIGBoeicsIHRoZSBrZXJuZWwgY2xvY2sgdGljay4gIEluIHRoaXMgY2FzZSwKIyB3ZSBuZWVkIHRvIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSBgaHonIGluIHNjb3BlIGFuZCBzZXQgdG8gYSB1c2VmdWwKIyB2YWx1ZSB3aGVuZXZlciB3ZSB1c2Ugb25lIG9mIHRoZXNlIGNvbnN0YW50cy4KIwpBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIFRDUCB0aW1lcnMgZGVwZW5kIG9uIFxgaHonLGFjX2N2X1RDUFRWX05FRURTX0haLApbQUNfRUdSRVBfQ1BQKGh6LApbI2luY2x1ZGUgPG5ldGluZXQvdGNwX3RpbWVyLmg+ClRDUFRWX1NSVFRERkxUCl0sIGFjX2N2X1RDUFRWX05FRURTX0haPXllcywgYWNfY3ZfVENQVFZfTkVFRFNfSFo9bm8pXSkKCmlmIHRlc3QgIngkYWNfY3ZfVENQVFZfTkVFRFNfSFoiID0gInh5ZXMiOyB0aGVuCiAgQUNfREVGSU5FKFRDUFRWX05FRURTX0haKQpmaQoKIwojIGRlZmluZSB0aGUgYWdlbnQgbGlicmFyaWVzIHZhcmlhYmxlCiMKQUNfU1VCU1QoQUdFTlRMSUJTKQpBQ19TVUJTVChPVEhFUkFHRU5UTElCT0JKUykKQUNfU1VCU1QoT1RIRVJBR0VOVExJQkxPQkpTKQoKIwojIFByb21wdCBmb3IgdmFyaW91cyBiaXRzIG9mIHVzZXIgaW5mb3JtYXRpb24KIwoKaWYgdGVzdCAieCRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0xPR0ZJTEUiID0gIngiIC1vICJ4JGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfU1lTX0xPQyIgPSAieCIgLW8gIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9TWVNfQ09OVEFDVCIgPSAieCIgLW8gIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgPSAieCI7IHRoZW4KQUNfQ0FDSEVfQ0hFQ0soaWYgeW91IGhhdmUgcnVuIGNvbmZpZ3VyZSBiZWZvcmUsIGFjX2N2X2hhdmVfd2FybmVkLApbCmlmIHRlc3QgIngkZGVmYXVsdHMiID0gInhubyI7IHRoZW4KY2F0IDw8IEVPRgoKCSAqKioqKioqKioqKioqKiBDb25maWd1cmF0aW9uIFNlY3Rpb24gKioqKioqKioqKioqKioKCglZb3UgYXJlIGFib3V0IHRvIGJlIHByb21wdGVkIHdpdGggYSBzZXJpZXMgb2YgcXVlc3Rpb25zLiAgQW5zd2VyCnRoZW0gY2FyZWZ1bGx5LCBhcyB0aGV5IGRldGVybWluZSBob3cgdGhlIFNOTVAgYWdlbnQgYW5kIHJlbGF0ZWQKYXBwbGljYXRpb25zIGFyZSB0byBmdW5jdGlvbi4KCglBZnRlciB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5pc2hlcywgeW91IGNhbiBicm93c2UgdGhlIG5ld2x5CmNyZWF0ZWQgbmV0LXNubXAtY29uZmlnLmggZmlsZSBmb3IgZnVydGhlciAtIGxlc3MgaW1wb3J0YW50IC0gcGFyYW1ldGVycyB0bwptb2RpZnkuICBCZSBjYXJlZnVsIGlmIHlvdSByZS1ydW4gY29uZmlndXJlIHRob3VnaCwgc2luY2UgbmV0LXNubXAtY29uZmlnLmggCndpbGwgYmUgb3ZlcndyaXR0ZW4uCgotUHJlc3MgcmV0dXJuIHRvIGNvbnRpbnVlLQpFT0YKCnJlYWQgdG1waW5wdXQKYWNfY3ZfaGF2ZV93YXJuZWQ9InllcyIKZWNobyAkRUNIT19OICJkaXNhYmxpbmcgYWJvdmUgcHJvbXB0IGZvciBmdXR1cmUgcnVucy4uLiAgJEVDSE9fQyIKZWxzZQogIGFjX2N2X2hhdmVfd2FybmVkPSJubyIKZmkKXSkKZWxzZQogIGFjX2N2X2hhdmVfd2FybmVkPSJ5ZXMiCmZpCgpNRT1gJFdIT0FNSWAKaWYgdGVzdCAtZiAvZXRjL3Jlc29sdi5jb25mOyB0aGVuCiAgTE9DPWBjYXQgL2V0Yy9yZXNvbHYuY29uZiB8IGdyZXAgJ15kb21haW4nIHwgdGFpbCAtMSB8IGF3ayAne3ByaW50ICRORn0nYAplbHNlCiAgTE9DPSJAbm8ud2hlcmUiCmZpCgpBQ19QUk9NUFRfVVNFUihORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OLFsKCioqKiBEZWZhdWx0IFNOTVAgVmVyc2lvbjoKCglTdGFydGluZyB3aXRoIE5ldC1TTk1QIDUuMCwgeW91IGNhbiBjaG9vc2UgdGhlIGRlZmF1bHQgdmVyc2lvbiBvZgp0aGUgU05NUCBwcm90b2NvbCB0byB1c2Ugd2hlbiBubyB2ZXJzaW9uIGlzIGdpdmVuIGV4cGxpY2l0bHkgb24gdGhlCmNvbW1hbmQgbGluZSwgb3IgdmlhIGFuICdzbm1wLmNvbmYnIGZpbGUuICBJbiB0aGUgcGFzdCB0aGlzIHdhcyBzZXQgdG8KU05NUHYxLCBidXQgeW91IGNhbiB1c2UgdGhpcyB0byBzd2l0Y2ggdG8gU05NUHYzIGlmIGRlc2lyZWQuICBTTk1QdjMKd2lsbCBwcm92aWRlIGEgbW9yZSBzZWN1cmUgbWFuYWdlbWVudCBlbnZpcm9ubWVudCAoYW5kIHRodXMgeW91J3JlCmVuY291cmFnZWQgdG8gc3dpdGNoIHRvIFNOTVB2MyksIGJ1dCBtYXkgYnJlYWsgZXhpc3Rpbmcgc2NyaXB0cyB0aGF0CnJlbHkgb24gdGhlIG9sZCBiZWhhdmlvdXIuICAoVGhvdWdoIHN1Y2ggc2NyaXB0cyB3aWxsIHByb2JhYmx5IG5lZWQgdG8KYmUgY2hhbmdlZCB0byB1c2UgdGhlICctYycgY29tbXVuaXR5IGZsYWcgYW55d2F5LCBhcyB0aGUgU05NUHYxCmNvbW1hbmQgbGluZSB1c2FnZSBoYXMgY2hhbmdlZCBhcyB3ZWxsLikuCiAgIEF0IHRoaXMgcHJvbXB0IHlvdSBjYW4gc2VsZWN0IFwiMVwiLCBcIjJcIiAoZm9yIFNOTVB2MmMpLCBvciBcIjNcIiBhcwp0aGUgZGVmYXVsdCB2ZXJzaW9uIGZvciB0aGUgY29tbWFuZCB0b29scyAoc25tcGdldCwgLi4uKSB0byB1c2UuICBUaGlzCmNhbiBhbHdheXMgYmUgb3ZlcnJpZGRlbiBhdCBydW50aW1lIHVzaW5nIHRoZSAtdiBmbGFnIHRvIHRoZSB0b29scywgb3IKYnkgdXNpbmcgdGhlIFwiZGVmVmVyc2lvblwiIHRva2VuIGluIHlvdXIgc25tcC5jb25mIGZpbGUuCiAgIFByb3ZpZGluZyB0aGUgLS13aXRoLWRlZmF1bHQtc25tcC12ZXJzaW9uPVwieFwiIHBhcmFtZXRlciB0byAuL2NvbmZpZ3VyZQp3aWxsIGF2b2lkIHRoaXMgcHJvbXB0LgoKRGVmYXVsdCB2ZXJzaW9uIG9mIFNOTVAgdG8gdXNlXSwzLHVucXVvdGVkKQoKIyB3ZSB0ZXN0ZWQgdGhpcyBhYm92ZSBiZWZvcmUgdGhlIHByb21wdCwgYnV0IHRoZSBwcm9tcHQgbWF5IGdpdmUgYSBuZXcgdmFsdWUuCmlmIHRlc3QgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMSIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMiIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMyI7IHRoZW4KICBBQ19NU0dfRVJST1IoW0lsbGVnYWwgdmVyc2lvbiBudW1iZXIuICBPbmx5IDEsIDIgKGZvciBTTk1QdjJjKSBhbmQgMyBhcmUgc3VwcG9ydGVkLl0pCmZpCgpBQ19QUk9NUFRfVVNFUihORVRTTk1QX1NZU19DT05UQUNULFsKCioqKiBTeXN0ZW0gQ29udGFjdCBJbmZvcm1hdGlvbjoKCglEZXNjcmliZXMgd2hvIHNob3VsZCBiZSBjb250YWN0ZWQgYWJvdXQgdGhlIGhvc3QgdGhlIGFnZW50IGlzCnJ1bm5pbmcgb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgTUlCLUlJIHRyZWUuICBUaGlzCmNhbiBhbHNvIGJlIG92ZXItcmlkZGVuIHVzaW5nIHRoZSBcInN5c2NvbnRhY3RcIiBzeW50YXggaW4gdGhlIGFnZW50J3MKY29uZmlndXJhdGlvbiBmaWxlcy4KICBQcm92aWRpbmcgdGhlIC0td2l0aC1zeXMtY29udGFjdD1cImNvbnRhY3RcIiBwYXJhbWV0ZXIgdG8gLi9jb25maWd1cmUKd2lsbCBhdm9pZCB0aGlzIHByb21wdC4KClN5c3RlbSBDb250YWN0IEluZm9ybWF0aW9uXSwkTUVAJExPQyxxdW90ZWQpCgpBQ19QUk9NUFRfVVNFUihORVRTTk1QX1NZU19MT0MsWwoKKioqIFN5c3RlbSBMb2NhdGlvbjoKCglEZXNjcmliZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeXN0ZW0uICBUaGlzIGluZm9ybWF0aW9uIGlzCmF2YWlsYWJsZSBpbiB0aGUgTUlCLUlJIHRyZWUuICB0aGlzIGNhbiBhbHNvIGJlIG92ZXItcmlkZGVuIHVzaW5nIHRoZQpcInN5c2xvY2F0aW9uXCIgc3ludGF4IGluIHRoZSBhZ2VudCdzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtc3lzLWxvY2F0aW9uPVwibG9jYXRpb25cIiBwYXJhbWV0ZXIgdG8gLi9jb25maWd1cmUKd2lsbCBhdm9pZCB0aGlzIHByb21wdC4KClN5c3RlbSBMb2NhdGlvbl0sVW5rbm93bixxdW90ZWQpCgppZiB0ZXN0IC1kIC92YXIvbG9nOyB0aGVuCiAgZGVmYXVsdGxvZz0iL3Zhci9sb2cvc25tcGQubG9nIgplbHNlCiAgZGVmYXVsdGxvZz0iL3Vzci9hZG0vc25tcGQubG9nIgpmaQogIApBQ19QUk9NUFRfVVNFUihORVRTTk1QX0xPR0ZJTEUsWwoKKioqIExvZ2ZpbGUgbG9jYXRpb246CgoJRW50ZXIgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSBzbm1wZCBhZ2VudCB0byBkdW1wCmluZm9ybWF0aW9uICYgZXJyb3JzIHRvLiAgSWYgbm90IGRlZmluZWQgKGVudGVyIHRoZSBrZXl3b3JkIFwibm9uZVwiCmF0IHRoZSBwcm9tcHQgYmVsb3cpIHRoZSBhZ2VudCB3aWxsIHVzZSBzdGRvdXQgYW5kIHN0ZGVyciBpbnN0ZWFkLgooTm90ZTogVGhpcyB2YWx1ZSBjYW4gYmUgb3Zlci1yaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMuKQogIFByb3ZpZGluZyB0aGUgLS13aXRoLWxvZ2ZpbGU9XCJwYXRoXCIgcGFyYW1ldGVyIHRvIC4vY29uZmlndXJlCndpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpMb2NhdGlvbiB0byB3cml0ZSBsb2dmaWxlXSwkZGVmYXVsdGxvZyxxdW90ZWQpCgppZiB0ZXN0IC1kIC92YXI7IHRoZW4KICBkZWZhdWx0c3RvcmU9Ii92YXIvbmV0LXNubXAiCiAgdWNkZGVmYXVsdHN0b3JlPSIvdmFyL3VjZC1zbm1wIgplbHNlCiAgZGVmYXVsdHN0b3JlPSIvZXRjL25ldC1zbm1wIgogIHVjZGRlZmF1bHRzdG9yZT0iL2V0Yy91Y2Qtc25tcCIKZmkKICAKQUNfUFJPTVBUX1VTRVIoTkVUU05NUF9QRVJTSVNURU5UX0RJUkVDVE9SWSxbCgoqKiogc25tcGQgcGVyc2lzdGVudCBzdG9yYWdlIGxvY2F0aW9uOgoKCUVudGVyIGEgZGlyZWN0b3J5IGZvciB0aGUgU05NUCBsaWJyYXJ5IHRvIHN0b3JlIHBlcnNpc3RlbnQKZGF0YSBpbiB0aGUgZm9ybSBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgZGVmYXVsdCBsb2NhdGlvbiBpcwpkaWZmZXJlbnQgdGhhbiB0aGUgb2xkIGRlZmF1bHQgbG9jYXRpb24gKHdoaWNoIHdhcyBmb3IgdWNkLXNubXApLiAgSWYKeW91IHN0YXkgd2l0aCB0aGUgbmV3IHBhdGgsIEknbGwgYXNrIHlvdSBpbiBhIHNlY29uZCBpZiB5b3Ugd2lzaCB0bwpjb3B5IHlvdXIgZmlsZXMgb3ZlciB0byB0aGUgbmV3IGxvY2F0aW9uIChvbmNlIG9ubHkpLiAgSWYgeW91IHBpY2sKc29tZSBvdGhlciBwYXRoIHRoYW4gdGhlIGRlZmF1bHQsIHlvdSdsbCBoYXZlIHRvIGNvcHkgdGhlbSB5b3Vyc2VsZi4KVGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHBpY2tpbmcgdGhlIG9sZCBwYXRoICgkdWNkZGVmYXVsdHN0b3JlKSBpZgp5b3UnZCByYXRoZXIuCiAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtcGVyc2lzdGVudC1kaXJlY3Rvcnk9XCJwYXRoXCIgcGFyYW1ldGVyIHRvCi4vY29uZmlndXJlIHdpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpMb2NhdGlvbiB0byB3cml0ZSBwZXJzaXN0ZW50IGluZm9ybWF0aW9uXSwkZGVmYXVsdHN0b3JlLHF1b3RlZCkKClBFUlNJU1RFTlRfRElSRUNUT1JZPSRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX1BFUlNJU1RFTlRfRElSRUNUT1JZCkFDX1NVQlNUKFBFUlNJU1RFTlRfRElSRUNUT1JZKQpVQ0RQRVJTSVNURU5UX0RJUkVDVE9SWT0kdWNkZGVmYXVsdHN0b3JlCkFDX1NVQlNUKFVDRFBFUlNJU1RFTlRfRElSRUNUT1JZKQoKaWYgdGVzdCAkUEVSU0lTVEVOVF9ESVJFQ1RPUlkgPSAiJGRlZmF1bHRzdG9yZSIgLWEgLWQgIiR1Y2RkZWZhdWx0c3RvcmUiIC1hICEgLWQgIiRkZWZhdWx0c3RvcmUiIDsgdGhlbgpBQ19DQUNIRV9DSEVDSyhJZiB3ZSBzaG91bGQgY29weSB0aGUgb2xkIHBlcnNpc3RlbnQgZGlyZWN0b3J5LCBhY19jdl91c2VyX3Byb21wdF9DT1BZX1BFUlNJU1RFTlRfRklMRVMsClsKQUNfUFJPTVBUX1VTRVJfTk9fREVGSU5FKGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUyxbCgoqKiogQ29weWluZyBvbGQgdWNkLXNubXAgcGVyc2lzdGVudCBmaWxlcyB0byBuZXQtc25tcCBwZXJzaXN0ZW50IGRpcmVjdG9yeToKCglXb3VsZCB5b3UgbGlrZSB0byBjb3B5IHRoZSBvbGRlciB1Y2Qtc25tcCBwZXJzaXN0ZW50IGZpbGVzCmludG8geW91ciBuZXcgbmV0LXNubXAgcGVyc2lzdGVudCBmaWxlIHBhdGg/ICBUaGlzIHdpbGwgZnVuY3Rpb25hbGx5CnNhdmUgYWxsIHlvdXIgdWNkLXNubXAgZGF0YSBhbmQgbGV0IGl0IGJlIHVzZWQgd2l0aGluIHRoZSBuZXQtc25tcAp0b29scy4gIFRoaXMgd2lsbCBvbmx5IGJlIGRvbmUgb25jZSB3aGVuIHlvdSBydW4gbWFrZSBpbnN0YWxsLiAgSWYgeW91Cndpc2ggdG8gZG8gdGhpcywgZW50ZXIgInllcyIgYXQgdGhlIHByb21wdC4KICBQcm92aWRpbmcgdGhlIC0td2l0aC1jb3B5LXBlcnNpc3RlbnQtZmlsZXM9XCJub1wiIChvciBcInllc1wiKQpwYXJhbWV0ZXJzIHRvIC4vY29uZmlndXJlIHdpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpDb3B5IHVjZC1zbm1wIGRhdGEgaW50byB0aGUgbmV0LXNubXAgZGF0YSBkaXJlY3RvcnldLCJ5ZXMiKQpdKQplbHNlCmFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUz0ibm8iCmZpCkNPUFlfUEVSU0lTVEVOVF9GSUxFUz0iJGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUyIKQUNfU1VCU1QoQ09QWV9QRVJTSVNURU5UX0ZJTEVTKQoKQUNfU1VCU1QoRExMSUJTKQoKQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZTpNYWtlZmlsZS50b3A6TWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW3NubXBsaWIvTWFrZWZpbGU6TWFrZWZpbGUudG9wOnNubXBsaWIvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6c25tcGxpYi9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FwcHMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFwcHMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YXBwcy9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FwcHMvc25tcG5ldHN0YXQvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFwcHMvc25tcG5ldHN0YXQvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YXBwcy9zbm1wbmV0c3RhdC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L01ha2VmaWxlOk1ha2VmaWxlLnRvcDphZ2VudC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphZ2VudC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L2hlbHBlcnMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFnZW50L2hlbHBlcnMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YWdlbnQvaGVscGVycy9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L21pYmdyb3VwL01ha2VmaWxlOk1ha2VmaWxlLnRvcDphZ2VudC9taWJncm91cC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphZ2VudC9taWJncm91cC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2xvY2FsL01ha2VmaWxlOk1ha2VmaWxlLnRvcDpsb2NhbC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlc10pCkFDX0NPTkZJR19GSUxFUyhbdGVzdGluZy9NYWtlZmlsZTpNYWtlZmlsZS50b3A6dGVzdGluZy9NYWtlZmlsZS5pbl0pCkFDX0NPTkZJR19GSUxFUyhbbWFuL01ha2VmaWxlOk1ha2VmaWxlLnRvcDptYW4vTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW21pYnMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOm1pYnMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW25ldC1zbm1wLWNvbmZpZzpuZXQtc25tcC1jb25maWcuaW5dLAoJCVtjaG1vZCAreCBuZXQtc25tcC1jb25maWddKQoKQUNfQ09ORklHX0NPTU1BTkRTKFtkZWZhdWx0XSwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oKQoKIwojIHByb3RlY3QgUEFDS0FHRV8qIHZhcmlhYmxlcwojCkFIX1ZFUkJBVElNKFtQQUNLQUdFX0JVR1JFUE9SVF0sWy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwojaWZuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCiN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAojZW5kaWZdKQpBSF9WRVJCQVRJTShbUEFDS0FHRV9OQU1FXSxbLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwojaWZuZGVmIFBBQ0tBR0VfTkFNRQojdW5kZWYgUEFDS0FHRV9OQU1FCiNlbmRpZl0pCkFIX1ZFUkJBVElNKFtQQUNLQUdFX1NUUklOR10sWy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1NUUklORwojdW5kZWYgUEFDS0FHRV9TVFJJTkcKI2VuZGlmXSkKQUhfVkVSQkFUSU0oW1BBQ0tBR0VfVEFSTkFNRV0sWy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1RBUk5BTUUKI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQojZW5kaWZdKQpBSF9WRVJCQVRJTShbUEFDS0FHRV9WRVJTSU9OXSxbLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1ZFUlNJT04KI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgojZW5kaWZdKQoKQUNfT1VUUFVUCgpBQ19NU0dfQ0FDSEVfRElTUExBWSgpCiMgTG9jYWwgVmFyaWFibGVzOgojIG1vZGU6IEF1dG9jb25mCiMgY29tbWVudC1zdGFydDogIiMiCiMgRW5kOgo=