Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLgogKgogKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHRhcmJhbGwgZm9yIGRldGFpbHMuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSAibGliYmIuaCIKI2luY2x1ZGUgPG1udGVudC5oPgoKI2luY2x1ZGUgIm1pbml4LmgiCgojaWZuZGVmIEJMS0dFVFNJWkUKI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KI2VuZGlmCgojaWZkZWYgVU5VU0VECmVudW0gewoJTUlOSVgxX0xJTktfTUFYID0gMjUwLAoJTUlOSVgyX0xJTktfTUFYID0gNjU1MzAsCglNSU5JWF9JX01BUF9TTE9UUyA9IDgsCglNSU5JWF9aX01BUF9TTE9UUyA9IDY0LAoJTUlOSVhfVjEgPSAweDAwMDEsICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KCU1JTklYX1YyID0gMHgwMDAyLCAgICAgIC8qIG1pbml4IFYyIGZzICovCglOQU1FX01BWCA9IDI1NSwgICAgICAgICAvKiAjIGNoYXJzIGluIGEgZmlsZSBuYW1lICovCn07CiNlbmRpZgoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgc21hbGxpbnQgdmVyc2lvbjI7CiNlbHNlCmVudW0geyB2ZXJzaW9uMiA9IDAgfTsKI2VuZGlmCgojZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS4yIC0gMTEvMTEvOTYiCnN0YXRpYyBzbWFsbGludCByZXBhaXIsIGF1dG9tYXRpYywgdmVyYm9zZSwgbGlzdCwgc2hvdywgd2Fybl9tb2RlLCBmb3JjZTsKc3RhdGljIHNtYWxsaW50IGNoYW5nZWQ7ICAvKiBpcyBmaWxlc3lzdGVtIG1vZGlmaWVkPyAqLwpzdGF0aWMgc21hbGxpbnQgZXJyb3JzX3VuY29ycmVjdGVkOyAgLyogZmxhZyBpZiBzb21lIGVycm9yIHdhcyBub3QgY29ycmVjdGVkICovCgpzdGF0aWMgc21hbGxpbnQgdGVybWlvc19zZXQ7CnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lOwpzdGF0aWMgaW50IElOOwpzdGF0aWMgaW50IGRpcmVjdG9yeSwgcmVndWxhciwgYmxvY2tkZXYsIGNoYXJkZXYsIGxpbmtzLCBzeW1saW5rcywgdG90YWw7CgovL2Fsc28gc21hbGxpbnQ/CnN0YXRpYyBpbnQgZGlyc2l6ZSA9IDE2OwpzdGF0aWMgaW50IG5hbWVsZW4gPSAxNDsKCnN0YXRpYyBjaGFyICppbm9kZV9idWZmZXI7CgpzdGF0aWMgc3RydWN0IHsKCWNoYXIgc3VwZXJfYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOwoJY2hhciBhZGRfem9uZV9pbmRfYmxrW0JMT0NLX1NJWkVdOwoJY2hhciBhZGRfem9uZV9kaW5kX2Jsa1tCTE9DS19TSVpFXTsKCVVTRV9GRUFUVVJFX01JTklYMihjaGFyIGFkZF96b25lX3RpbmRfYmxrW0JMT0NLX1NJWkVdOykKCWNoYXIgY2hlY2tfZmlsZV9ibGtbQkxPQ0tfU0laRV07Cn0gKmJsb2NrYnVmOwoKI2RlZmluZSBJbm9kZTEgKCgoc3RydWN0IG1pbml4MV9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCiNkZWZpbmUgSW5vZGUyICgoKHN0cnVjdCBtaW5peDJfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQoKI2RlZmluZSBTdXBlciAoKihzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKikoYmxvY2tidWYtPnN1cGVyX2Jsb2NrX2J1ZmZlcikpCgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCiMgZGVmaW5lIFpPTkVTICAgICgodW5zaWduZWQpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKIyBkZWZpbmUgWk9ORVMgICAgKCh1bnNpZ25lZCkoU3VwZXIuc19uem9uZXMpKQojZW5kaWYKI2RlZmluZSBJTk9ERVMgICAgKCh1bnNpZ25lZClTdXBlci5zX25pbm9kZXMpCiNkZWZpbmUgSU1BUFMgICAgICgodW5zaWduZWQpU3VwZXIuc19pbWFwX2Jsb2NrcykKI2RlZmluZSBaTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkKVN1cGVyLnNfZmlyc3RkYXRhem9uZSkKI2RlZmluZSBaT05FU0laRSAgKCh1bnNpZ25lZClTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAgICgodW5zaWduZWQpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAgICAgKFN1cGVyLnNfbWFnaWMpCgovKiBnY2MgbGlrZXMgdGhpcyBtb3JlIChjb2RlIGlzIHNtYWxsZXIpIHRoYW4gbWFjcm8gdmFyaWFudCAqLwpzdGF0aWMgQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgdW5zaWduZWQgZGl2X3JvdW5kdXAodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbikKewoJcmV0dXJuIChzaXplICsgbi0xKSAvIG47Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBJTk9ERV9CTE9DS1MgZGl2X3JvdW5kdXAoSU5PREVTLCAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyBcCgkJCQkgICAgOiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykpCiNlbHNlCiNkZWZpbmUgSU5PREVfQkxPQ0tTIGRpdl9yb3VuZHVwKElOT0RFUywgTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0spCiNlbmRpZgoKI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAgICAoMiArIElNQVBTICsgWk1BUFMgKyBJTk9ERV9CTE9DS1MpCgpzdGF0aWMgY2hhciAqaW5vZGVfbWFwOwpzdGF0aWMgY2hhciAqem9uZV9tYXA7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQ7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50OwoKLyogQmVmb3JlIHlvdSBhc2sgIndoZXJlIHRoZXkgY29tZSBmcm9tPyI6ICovCi8qIHNldGJpdC9jbHJiaXQgYXJlIHN1cHBsaWVkIGJ5IHN5cy9wYXJhbS5oICovCgpzdGF0aWMgaW50IG1pbml4X2JpdChjb25zdCBjaGFyICphLCB1bnNpZ25lZCBpKQp7CglyZXR1cm4gKGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKSk7Cn0KCnN0YXRpYyB2b2lkIG1pbml4X3NldGJpdChjaGFyICphLCB1bnNpZ25lZCBpKQp7CglzZXRiaXQoYSwgaSk7CgljaGFuZ2VkID0gMTsKfQpzdGF0aWMgdm9pZCBtaW5peF9jbHJiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKewoJY2xyYml0KGEsIGkpOwoJY2hhbmdlZCA9IDE7Cn0KCi8qIE5vdGU6IGRvIG5vdCBhc3N1bWUgMC8xLCBpdCBpcyAwL25vbnplcm8gKi8KI2RlZmluZSB6b25lX2luX3VzZSh4KSAgKG1pbml4X2JpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQojZGVmaW5lIGlub2RlX2luX3VzZSh4KSAobWluaXhfYml0KGlub2RlX21hcCwoeCkpKQoKI2RlZmluZSBtYXJrX2lub2RlKHgpICAgKG1pbml4X3NldGJpdChpbm9kZV9tYXAsKHgpKSkKI2RlZmluZSB1bm1hcmtfaW5vZGUoeCkgKG1pbml4X2NscmJpdChpbm9kZV9tYXAsKHgpKSkKCiNkZWZpbmUgbWFya196b25lKHgpICAgKG1pbml4X3NldGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQojZGVmaW5lIHVubWFya196b25lKHgpIChtaW5peF9jbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW5vKTsKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGlubyk7CiNlbmRpZgoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikgQVRUUklCVVRFX05PUkVUVVJOOwpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyIsIHN0cik7Cn0KCi8qIEZpbGUtbmFtZSBkYXRhICovCmVudW0geyBNQVhfREVQVEggPSAzMiB9OwpzdGF0aWMgaW50IG5hbWVfZGVwdGg7CnN0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7CnN0YXRpYyBjaGFyICpuYW1lX2NvbXBvbmVudFtNQVhfREVQVEgrMV07CgovKiBXZWQgRmViICA5IDE1OjE3OjA2IE1TVCAyMDAwICovCi8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlIG5hbWVfbGlzdCAoaW5zdGVhZCBvZiBtYWtpbmcgaXQgc3RhdGljKSAqLwpzdGF0aWMgdm9pZCBhbGxvY19jdXJyZW50X25hbWUodm9pZCkKewoJY3VycmVudF9uYW1lID0geG1hbGxvYyhNQVhfREVQVEggKiAoQlVGU0laICsgMSkpOwoJY3VycmVudF9uYW1lWzBdID0gJy8nOwoJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKCW5hbWVfY29tcG9uZW50WzBdID0gJmN1cnJlbnRfbmFtZVswXTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCi8qIGV4ZWN1dGUgdGhpcyBhdGV4aXQoKSB0byBkZWFsbG9jYXRlIG5hbWVfbGlzdFtdICovCi8qIHBpcHRpZ2dlciB3YXMgaGVyZSAqLwpzdGF0aWMgdm9pZCBmcmVlX2N1cnJlbnRfbmFtZSh2b2lkKQp7CglmcmVlKGN1cnJlbnRfbmFtZSk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBwdXNoX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCnsKCS8vICAvZGlyL2Rpci9kaXIvZmlsZQoJLy8gIF4gICBeICAgXgoJLy8gWzBdIFsxXSBbMl0gPC1uYW1lX2NvbXBvbmVudFtpXQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpIHsKCQlpbnQgbGVuOwoJCWNoYXIgKnAgPSBuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXTsKCQkqcCsrID0gJy8nOwoJCWxlbiA9IHNwcmludGYocCwgIiUuKnMiLCBuYW1lbGVuLCBuYW1lKTsKCQluYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoICsgMV0gPSBwICsgbGVuOwoJfQoJbmFtZV9kZXB0aCsrOwp9CgpzdGF0aWMgdm9pZCBwb3BfZmlsZW5hbWUodm9pZCkKewoJbmFtZV9kZXB0aC0tOwoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpIHsKCQkqbmFtZV9jb21wb25lbnRbbmFtZV9kZXB0aF0gPSAnXDAnOwoJCWlmICghbmFtZV9kZXB0aCkgewoJCQljdXJyZW50X25hbWVbMF0gPSAnLyc7CgkJCWN1cnJlbnRfbmFtZVsxXSA9ICdcMCc7CgkJfQoJfQp9CgpzdGF0aWMgaW50IGFzayhjb25zdCBjaGFyICpzdHJpbmcsIGludCBkZWYpCnsKCWludCBjOwoKCWlmICghcmVwYWlyKSB7CgkJcHV0cygiIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gMDsKCX0KCWlmIChhdXRvbWF0aWMpIHsKCQlwdXRzKCIiKTsKCQlpZiAoIWRlZikKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZiA/ICIlcyAoeS9uKT8gIiA6ICIlcyAobi95KT8gIiwgc3RyaW5nKTsKCWZvciAoOzspIHsKCQlmZmx1c2goc3Rkb3V0KTsKCQljID0gZ2V0Y2hhcigpOwoJCWlmIChjID09IEVPRikgewoJCQlpZiAoIWRlZikKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWMgPSB0b3VwcGVyKGMpOwoJCWlmIChjID09ICdZJykgewoJCQlkZWYgPSAxOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJ04nKSB7CgkJCWRlZiA9IDA7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nKQoJCQlicmVhazsKCX0KCWlmIChkZWYpCgkJcHJpbnRmKCJ5XG4iKTsKCWVsc2UgewoJCXByaW50ZigiblxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqZjsKCXN0cnVjdCBtbnRlbnQgKm1udDsKCWludCBjb250OwoJaW50IGZkOwoKCWYgPSBzZXRtbnRlbnQoTU9VTlRFRCwgInIiKTsKCWlmIChmID09IE5VTEwpCgkJcmV0dXJuOwoJd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQoZikpICE9IE5VTEwpCgkJaWYgKHN0cmNtcChkZXZpY2VfbmFtZSwgbW50LT5tbnRfZnNuYW1lKSA9PSAwKQoJCQlicmVhazsKCWVuZG1udGVudChmKTsKCWlmICghbW50KQoJCXJldHVybjsKCgkvKgoJICogSWYgdGhlIHJvb3QgaXMgbW91bnRlZCByZWFkLW9ubHksIHRoZW4gL2V0Yy9tdGFiIGlzCgkgKiBwcm9iYWJseSBub3QgY29ycmVjdDsgc28gd2Ugd29uJ3QgaXNzdWUgYSB3YXJuaW5nIGJhc2VkIG9uCgkgKiBpdC4KCSAqLwoJZmQgPSBvcGVuKE1PVU5URUQsIE9fUkRXUik7CglpZiAoZmQgPCAwICYmIGVycm5vID09IEVST0ZTKQoJCXJldHVybjsKCWNsb3NlKGZkKTsKCglwcmludGYoIiVzIGlzIG1vdW50ZWQuICIsIGRldmljZV9uYW1lKTsKCWNvbnQgPSAwOwoJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkpCgkJY29udCA9IGFzaygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiwgMCk7CglpZiAoIWNvbnQpIHsKCQlwcmludGYoIkNoZWNrIGFib3J0ZWRcbiIpOwoJCWV4aXQoMCk7Cgl9Cn0KCi8qCiAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CiAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAogKiBpZiBhbiBlcnJvciB3YXMgY29ycmVjdGVkLCBhbmQgcmV0dXJucyB0aGUgem9uZSAoMCBmb3Igbm8gem9uZQogKiBvciBhIGJhZCB6b25lLW51bWJlcikuCiAqLwpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIyKHVpbnQzMl90ICpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJY29uc3QgY2hhciAqbXNnOwoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCW1zZyA9ICI8IEZJUlNUWk9ORSI7CgllbHNlIGlmICgqbnIgPj0gWk9ORVMpCgkJbXNnID0gIj49IFpPTkVTIjsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRmKCJab25lIG5yICVzIGluIGZpbGUgJyVzJy4gIiwgbXNnLCBjdXJyZW50X25hbWUpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1aW50MTZfdCAqbnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCXVpbnQzMl90IG5yMzIgPSAqbnI7CglpbnQgciA9IGNoZWNrX3pvbmVfbnIyKCZucjMyLCBjb3JyZWN0ZWQpOwoJKm5yID0gKHVpbnQxNl90KW5yMzI7CglyZXR1cm4gcjsKfQoKLyoKICogcmVhZC1ibG9jayByZWFkcyBibG9jayBuciBpbnRvIHRoZSBidWZmZXIgYXQgYWRkci4KICovCnN0YXRpYyB2b2lkIHJlYWRfYmxvY2sodW5zaWduZWQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpIHsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpIHsKCQlwcmludGYoIiVzOiBjYW5ub3Qgc2VlayB0byBibG9jayBpbiBmaWxlICclcydcbiIsCgkJCQliYl9tc2dfcmVhZF9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiJXM6IGJhZCBibG9jayBpbiBmaWxlICclcydcbiIsCgkJCQliYl9tc2dfcmVhZF9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCX0KfQoKLyoKICogd3JpdGVfYmxvY2sgd3JpdGVzIGJsb2NrIG5yIHRvIGRpc2suCiAqLwpzdGF0aWMgdm9pZCB3cml0ZV9ibG9jayh1bnNpZ25lZCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikKCQlyZXR1cm47CglpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKCQlwcmludGYoIkludGVybmFsIGVycm9yOiB0cnlpbmcgdG8gd3JpdGUgYmFkIGJsb2NrXG4iCgkJCSAgICJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCIlczogYmFkIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ193cml0ZV9lcnJvciwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXBfYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCnsKCXVpbnQxNl90IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdWludDE2X3QgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsb2NrLCByZXN1bHQ7CglzbWFsbGludCBibGtfY2hnOwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgNTEyKSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSA1MTI7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGRpbmQgKyAoYmxrbnIgLyA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoaW5kICsgKGJsa25yICUgNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCnsKCXVpbnQzMl90IGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdWludDMyX3QgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsb2NrLCByZXN1bHQ7CglzbWFsbGludCBibGtfY2hnOwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTY7CglpZiAoYmxrbnIgPj0gMjU2ICogMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyBibGtuciAvIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxvY2sgPSByZXN1bHQ7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2ICogMjU2OwoJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKHRpbmQgKyBibGtuciAvICgyNTYgKiAyNTYpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgKGJsa25yIC8gMjU2KSAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUyB8IE1JTklYX0VSUk9SX0ZTOwoJaWYgKCFlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJU3VwZXIuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CgoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX3N1cGVyX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYmxvY2tidWYtPnN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3Qgd3JpdGUgc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCnsKCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3Qgd3JpdGUgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJjYW5ub3Qgd3JpdGUgaW5vZGVzIik7Cn0KCnN0YXRpYyB2b2lkIGdldF9kaXJzaXplKHZvaWQpCnsKCWludCBibG9jazsKCWNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IHNpemU7CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpCgkJYmxvY2sgPSBJbm9kZTJbTUlOSVhfUk9PVF9JTk9dLmlfem9uZVswXTsKCWVsc2UKI2VuZGlmCgkJYmxvY2sgPSBJbm9kZTFbTUlOSVhfUk9PVF9JTk9dLmlfem9uZVswXTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKCQlpZiAoc3RyY21wKGJsayArIHNpemUgKyAyLCAiLi4iKSA9PSAwKSB7CgkJCWRpcnNpemUgPSBzaXplOwoJCQluYW1lbGVuID0gc2l6ZSAtIDI7CgkJCXJldHVybjsKCQl9Cgl9CgkvKiB1c2UgZGVmYXVsdHMgKi8KfQoKc3RhdGljIHZvaWQgcmVhZF9zdXBlcmJsb2NrKHZvaWQpCnsKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYmxvY2tidWYtPnN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBzdXBlciBibG9jayIpOwoJLyogYWxyZWFkeSBpbml0aWFsaXplZCB0bzoKCW5hbWVsZW4gPSAxNDsKCWRpcnNpemUgPSAxNjsKCXZlcnNpb24yID0gMDsKCSovCglpZiAoTUFHSUMgPT0gTUlOSVgxX1NVUEVSX01BR0lDKSB7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMV9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQykgewoJCXZlcnNpb24yID0gMTsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAxOwojZW5kaWYKCX0gZWxzZQoJCWRpZSgiYmFkIG1hZ2ljIG51bWJlciBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpPTkVTSVpFICE9IDAgfHwgQkxPQ0tfU0laRSAhPSAxMDI0KQoJCWRpZSgib25seSAxayBibG9ja3Mvem9uZXMgc3VwcG9ydGVkIik7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICogOCA8IElOT0RFUyArIDEpCgkJZGllKCJiYWQgc19pbWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAqIDggPCBaT05FUyAtIEZJUlNUWk9ORSArIDEpCgkJZGllKCJiYWQgc196bWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwp9CgpzdGF0aWMgdm9pZCByZWFkX3RhYmxlcyh2b2lkKQp7Cglpbm9kZV9tYXAgPSB4emFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7Cgl6b25lX21hcCA9IHh6YWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKCWlub2RlX2J1ZmZlciA9IHhtYWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOwoJaW5vZGVfY291bnQgPSB4bWFsbG9jKElOT0RFUyArIDEpOwoJem9uZV9jb3VudCA9IHhtYWxsb2MoWk9ORVMpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiY2Fubm90IHJlYWQgaW5vZGVzIik7CglpZiAoTk9STV9GSVJTVFpPTkUgIT0gRklSU1RaT05FKSB7CgkJcHJpbnRmKCJ3YXJuaW5nOiBmaXJzdHpvbmUhPW5vcm1fZmlyc3R6b25lXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZ2V0X2RpcnNpemUoKTsKCWlmIChzaG93KSB7CgkJcHJpbnRmKCIldSBpbm9kZXNcbiIKCQkJIiV1IGJsb2Nrc1xuIgoJCQkiRmlyc3RkYXRhem9uZT0ldSAoJXUpXG4iCgkJCSJab25lc2l6ZT0ldVxuIgoJCQkiTWF4c2l6ZT0ldVxuIgoJCQkiRmlsZXN5c3RlbSBzdGF0ZT0ldVxuIgoJCQkibmFtZWxlbj0ldVxuXG4iLAoJCQlJTk9ERVMsCgkJCVpPTkVTLAoJCQlGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FLAoJCQlCTE9DS19TSVpFIDw8IFpPTkVTSVpFLAoJCQlNQVhTSVpFLAoJCQlTdXBlci5zX3N0YXRlLAoJCQluYW1lbGVuKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBtaW5peDFfaW5vZGUgKmdldF9pbm9kZSh1bnNpZ25lZCBucikKewoJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlMSArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBpcyBtYXJrZWQgYXMgJ3VudXNlZCcsIGJ1dCBpdCBpcyB1c2VkICIKCQkJCQkiZm9yIGZpbGUgJyVzJ1xuIiwgbnIsIGN1cnJlbnRfbmFtZSk7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgYXMgJ2luIHVzZSciLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJCWVsc2UKCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludGYoIiVzIGhhcyBtb2RlICUwNW9cbiIsIGN1cnJlbnRfbmFtZSwgaW5vZGUtPmlfbW9kZSk7CgkJfQoKCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBzdHJ1Y3QgbWluaXgyX2lub2RlICpnZXRfaW5vZGUyKHVuc2lnbmVkIG5yKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUyICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgoJCQkJCSJmb3IgZmlsZSAnJXMnXG4iLCBuciwgY3VycmVudF9uYW1lKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBhcyAnaW4gdXNlJyIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQkJZWxzZQoJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50ZigiJXMgaGFzIG1vZGUgJTA1b1xuIiwgY3VycmVudF9uYW1lLCBpbm9kZS0+aV9tb2RlKTsKCQl9Cgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZ1xuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3Qodm9pZCkKewoJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSBJbm9kZTEgKyBNSU5JWF9ST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgTUlOSVhfUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZWxzZQp2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpOwojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkFscmVhZHkgdXNlZCBibG9jayBpcyByZXVzZWQgaW4gZmlsZSAnJXMnLiAiLAoJCQkJY3VycmVudF9uYW1lKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSAnJXMnIGlzIG1hcmtlZCBhcyAndW51c2VkJy4gIiwKCQkJCWJsb2NrLCBjdXJyZW50X25hbWUpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgYWRkX3pvbmUyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQWxyZWFkeSB1c2VkIGJsb2NrIGlzIHJldXNlZCBpbiBmaWxlICclcycuICIsCgkJCQljdXJyZW50X25hbWUpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiAwOwoJCX0KCX0KCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlICclcycgaXMgbWFya2VkIGFzICd1bnVzZWQnLiAiLAoJCQkJYmxvY2ssIGN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewojZGVmaW5lIGJsayAoYmxvY2tidWYtPmFkZF96b25lX2luZF9ibGspCglpbnQgaTsKCWludCBibG9jazsKCXNtYWxsaW50IGNoZ19ibGsgPSAwOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmUoaSArICh1aW50MTZfdCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwojdW5kZWYgYmxrCn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CiNkZWZpbmUgYmxrIChibG9ja2J1Zi0+YWRkX3pvbmVfaW5kX2JsaykKCWludCBpOwoJaW50IGJsb2NrOwoJc21hbGxpbnQgY2hnX2JsayA9IDA7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lMihpICsgKHVpbnQzMl90ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CiN1bmRlZiBibGsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewojZGVmaW5lIGJsayAoYmxvY2tidWYtPmFkZF96b25lX2RpbmRfYmxrKQoJaW50IGk7CglpbnQgYmxvY2s7CglzbWFsbGludCBjaGdfYmxrID0gMDsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVpbnQxNl90ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CiN1bmRlZiBibGsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CiNkZWZpbmUgYmxrIChibG9ja2J1Zi0+YWRkX3pvbmVfZGluZF9ibGspCglpbnQgaTsKCWludCBibG9jazsKCXNtYWxsaW50IGNoZ19ibGsgPSAwOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9pbmQyKGkgKyAodWludDMyX3QgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKI3VuZGVmIGJsawp9CgpzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CiNkZWZpbmUgYmxrIChibG9ja2J1Zi0+YWRkX3pvbmVfdGluZF9ibGspCglpbnQgaTsKCWludCBibG9jazsKCXNtYWxsaW50IGNoZ19ibGsgPSAwOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9kaW5kMihpICsgKHVpbnQzMl90ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CiN1bmRlZiBibGsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGkpCnsKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZTEgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkJIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCnsKI2RlZmluZSBibGsgKGJsb2NrYnVmLT5jaGVja19maWxlX2JsaykKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodWludDE2X3QgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCgkJCQljdXJyZW50X25hbWUsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIlJlbW92ZSIsIDEpKSB7CgkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlub2RlID0gZ2V0X2lub2RlKGlubyk7Cglwb3BfZmlsZW5hbWUoKTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKGlub2RlICYmIExPTkVfQ0hBUihuYW1lLCAnLicpKQoJCQlyZXR1cm47CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoaW5vZGUgJiYgc3RyY21wKCIuLiIsIG5hbWUpID09IDApCgkJCXJldHVybjsKCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOwoJfQoJY2hlY2tfem9uZXMoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjayhpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7CiN1bmRlZiBibGsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19maWxlMihzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXIsIHVuc2lnbmVkIG9mZnNldCkKewojZGVmaW5lIGJsayAoYmxvY2tidWYtPmNoZWNrX2ZpbGVfYmxrKQoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jazIoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodWludDE2X3QgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCgkJCQljdXJyZW50X25hbWUsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIlJlbW92ZSIsIDEpKSB7CgkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlub2RlID0gZ2V0X2lub2RlMihpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7CglpZiAoIW9mZnNldCkgewoJCWlmIChpbm9kZSAmJiBMT05FX0NIQVIobmFtZSwgJy4nKSkKCQkJcmV0dXJuOwoJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKGlub2RlICYmIHN0cmNtcCgiLi4iLCBuYW1lKSA9PSAwKQoJCQlyZXR1cm47CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludGYoIiVzJXNcbiIsIGN1cnJlbnRfbmFtZSwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/ICI6IiA6ICIiKTsKCX0KCWNoZWNrX3pvbmVzMihpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrMihpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7CiN1bmRlZiBibGsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbm8pCnsKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIG9mZnNldDsKCglkaXIgPSBJbm9kZTEgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUyICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJhZF96b25lKGludCBpKQp7CgljaGFyIGJ1ZmZlcltCTE9DS19TSVpFXTsKCglpZiAoQkxPQ0tfU0laRSAqIGkgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICh3YXJuX21vZGUgJiYgSW5vZGUxW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaGFzIG5vbi16ZXJvIG1vZGUuICIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZTFbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJVbnVzZWQgaW5vZGUgJWQgaXMgbWFya2VkIGFzICd1c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaXMgdXNlZCwgYnV0IG1hcmtlZCBhcyAndW51c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGUxW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAoJCQkJaSwgSW5vZGUxW2ldLmlfbW9kZSwgSW5vZGUxW2ldLmlfbmxpbmtzLAoJCQkJaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGUxW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoKHpvbmVfaW5fdXNlKGkpICE9IDApID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAod2Fybl9tb2RlICYmIElub2RlMltpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMltpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKCQkJCWksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKCQkJCWlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZCBpcyBtYXJrZWQgJ2luIHVzZScsIGJ1dCBubyBmaWxlIHVzZXMgaXQuICIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVjayh2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMoTUlOSVhfUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrKE1JTklYX1JPT1RfSU5PKTsKCWNoZWNrX2NvdW50cygpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrMih2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMyKE1JTklYX1JPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjazIoTUlOSVhfUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzMigpOwp9CiNlbHNlCnZvaWQgY2hlY2syKHZvaWQpOwojZW5kaWYKCmludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXN0cnVjdCB0ZXJtaW9zIHRtcDsKCWludCByZXRjb2RlID0gMDsKCgl4ZnVuY19lcnJvcl9yZXR2YWwgPSA4OwoJYmxvY2tidWYgPSB4emFsbG9jKHNpemVvZigqYmxvY2tidWYpKTsKCglhbGxvY19jdXJyZW50X25hbWUoKTsKI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCgkvKiBEb24ndCBib3RoZXIgdG8gZnJlZSBtZW1vcnkuICBFeGl0IGRvZXMKCSAqIHRoYXQgYXV0b21hZ2ljYWxseSwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KCWF0ZXhpdChmcmVlX2N1cnJlbnRfbmFtZSk7CiNlbmRpZgoKCWlmIChJTk9ERV9TSVpFMSAqIE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgaW5vZGUgc2l6ZSIpOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCglpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIHYyIGlub2RlIHNpemUiKTsKI2VuZGlmCgl3aGlsZSAoLS1hcmdjICE9IDApIHsKCQlhcmd2Kys7CgkJaWYgKGFyZ3ZbMF1bMF0gIT0gJy0nKSB7CgkJCWlmIChkZXZpY2VfbmFtZSkKCQkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJZGV2aWNlX25hbWUgPSBhcmd2WzBdOwoJCX0gZWxzZSB7CgkJCXdoaWxlICgqKythcmd2WzBdKSB7CgkJCQlzd2l0Y2ggKGFyZ3ZbMF1bMF0pIHsKCQkJCWNhc2UgJ2wnOgoJCQkJCWxpc3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYSc6CgkJCQkJYXV0b21hdGljID0gMTsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncic6CgkJCQkJYXV0b21hdGljID0gMDsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAndic6CgkJCQkJdmVyYm9zZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdzJzoKCQkJCQlzaG93ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ20nOgoJCQkJCXdhcm5fbW9kZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdmJzoKCQkJCQlmb3JjZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJCX0KCQkJfQoJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpCgkJYmJfc2hvd191c2FnZSgpOwoKCWNoZWNrX21vdW50KCk7CQkJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSB4b3BlbihkZXZpY2VfbmFtZSwgcmVwYWlyID8gT19SRFdSIDogT19SRE9OTFkpOwoKCS8qc3luYygpOyBwYXJhbm9pYT8gKi8KCXJlYWRfc3VwZXJibG9jaygpOwoKCS8qCgkgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdGhlIGNoZWNraW5nLgoJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkIGFuZCBlcnJvcgoJICogZmxhZ3MgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSAtZiBzd2l0Y2ggd2FzIHNwZWNpZmllZCBvbiB0aGUKCSAqIGNvbW1hbmQgbGluZS4KCSAqLwoJcHJpbnRmKCIlcywgIlBST0dSQU1fVkVSU0lPTiJcbiIsIGFwcGxldF9uYW1lKTsKCglpZiAoIShTdXBlci5zX3N0YXRlICYgTUlOSVhfRVJST1JfRlMpCgkgJiYgKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykgJiYgIWZvcmNlCgkpIHsKCQlpZiAocmVwYWlyKQoJCQlwcmludGYoIiVzIGlzIGNsZWFuLCBjaGVjayBpcyBza2lwcGVkXG4iLCBkZXZpY2VfbmFtZSk7CgkJcmV0dXJuIDA7Cgl9IGVsc2UgaWYgKGZvcmNlKQoJCXByaW50ZigiRm9yY2luZyBmaWxlc3lzdGVtIGNoZWNrIG9uICVzXG4iLCBkZXZpY2VfbmFtZSk7CgllbHNlIGlmIChyZXBhaXIpCgkJcHJpbnRmKCJGaWxlc3lzdGVtIG9uICVzIGlzIGRpcnR5LCBuZWVkcyBjaGVja2luZ1xuIiwKCQkJICAgZGV2aWNlX25hbWUpOwoKCXJlYWRfdGFibGVzKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJdGNnZXRhdHRyKDAsICZ0ZXJtaW9zKTsKCQl0bXAgPSB0ZXJtaW9zOwoJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0bXApOwoJCXRlcm1pb3Nfc2V0ID0gMTsKCX0KCglpZiAodmVyc2lvbjIpIHsKCQljaGVja19yb290MigpOwoJCWNoZWNrMigpOwoJfSBlbHNlIHsKCQljaGVja19yb290KCk7CgkJY2hlY2soKTsKCX0KCglpZiAodmVyYm9zZSkgewoJCWludCBpLCBmcmVlX2NudDsKCgkJZm9yIChpID0gMSwgZnJlZV9jbnQgPSAwOyBpIDw9IElOT0RFUzsgaSsrKQoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCJcbiU2dSBpbm9kZXMgdXNlZCAoJXUlJSlcbiIsIChJTk9ERVMgLSBmcmVlX2NudCksCgkJCSAgIDEwMCAqIChJTk9ERVMgLSBmcmVlX2NudCkgLyBJTk9ERVMpOwoJCWZvciAoaSA9IEZJUlNUWk9ORSwgZnJlZV9jbnQgPSAwOyBpIDwgWk9ORVM7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCIlNnUgem9uZXMgdXNlZCAoJXUlJSlcblxuIgoJCQkgICAiJTZ1IHJlZ3VsYXIgZmlsZXNcbiIKCQkJICAgIiU2dSBkaXJlY3Rvcmllc1xuIgoJCQkgICAiJTZ1IGNoYXJhY3RlciBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2dSBibG9jayBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2dSBsaW5rc1xuIgoJCQkgICAiJTZ1IHN5bWJvbGljIGxpbmtzXG4iCgkJCSAgICItLS0tLS1cbiIKCQkJICAgIiU2dSBmaWxlc1xuIiwKCQkJICAgKFpPTkVTIC0gZnJlZV9jbnQpLCAxMDAgKiAoWk9ORVMgLSBmcmVlX2NudCkgLyBaT05FUywKCQkJICAgcmVndWxhciwgZGlyZWN0b3J5LCBjaGFyZGV2LCBibG9ja2RldiwKCQkJICAgbGlua3MgLSAyICogZGlyZWN0b3J5ICsgMSwgc3ltbGlua3MsCgkJCSAgIHRvdGFsIC0gMiAqIGRpcmVjdG9yeSArIDEpOwoJfQoJaWYgKGNoYW5nZWQpIHsKCQl3cml0ZV90YWJsZXMoKTsKCQlwcmludGYoIkZJTEUgU1lTVEVNIEhBUyBCRUVOIENIQU5HRURcbiIpOwoJCXN5bmMoKTsKCX0gZWxzZSBpZiAocmVwYWlyKQoJCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKQoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdGVybWlvcyk7CgoJaWYgKGNoYW5nZWQpCgkJcmV0Y29kZSArPSAzOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlyZXRjb2RlICs9IDQ7CglyZXR1cm4gcmV0Y29kZTsKfQo=